1

わかりません.. 面白いけどわかりません ))

以下を参照してください

echo -n '\\prj\prj.prjjmbr.Interp\PRIL_35.jpg' | awk -F ';' '{a=length($1);print lenght a}'

出力は 35 です。

echo -n '\\prj\prj.prjjmbr.Interp\PRIL_35.jpg' | wc -c

出力は 35 です。

echo -n '\\prj\prj.prjjmbr.Interp\Very long path with cyrillic symbols\полученные данные_по проект\отчеты\Отчет \Dinam_interp_2D_yujo-vost_ch_Urabor-Yahinskij_LU_2008 ( GNPTs_PurGeo ) \Otchet\GrafPril\PRIL_35.jpg' | awk -F ';' '{print length ($1)}'

出力は 202 です。

echo -n '\\prj\prj.prjjmbr.Interp\Very long path with cyrillic symbols\полученные данные_по проект\отчеты\Отчет \Dinam_interp_2D_yujo-vost_ch_Urabor-Yahinskij_LU_2008 ( GNPTs_PurGeo ) \Otchet\GrafPril\PRIL_35.jpg' | wc -c

出力は 237 です。

非ラテン記号で異なる結果が得られるのはなぜですか? どうすれば修正できますか?

ps 修正後、substr 関数、つまり substr (path, 10, 8); を使用する必要があります。

4

2 に答える 2

11

文字列の文字数と文字列のバイト数には違いがあるため、非ラテン記号では異なる結果が得られます。wc -cはバイト数を返し、文字数をawk返します。

必ず正しい番号を使用してください。文字列を保存する必要がある場合は、バイト数を知る必要があります。文字列を表示する必要がある場合は、文字数に関心があるかもしれません。

からman wc:

-c, --bytes バイト数を出力します

からman awk:

バージョン 3.1.5 の時点で、gawk はマルチバイト対応です。つまり、index()、length()、substr()、および match() はすべて、バイト単位ではなく文字単位で機能します。

于 2012-10-08T03:37:41.410 に答える
0

私はあなたの発見を再現することができ、それがロケールに関連していると仮定しました. 修正ではなく、「回避策」...

echo -n '\\prj\prj.prjjmbr.Interp\Very long path with cyrillic symbols\полученные данные_по проект\отчеты\Отчет \Dinam_interp_2D_yujo-vost_ch_Urabor-Yahinskij_LU_2008 ( GNPTs_PurGeo ) \Otchet\GrafPril\PRIL_35.jpg' | LANG=C awk -F ';' '{print length ($1)}'
于 2012-10-08T03:32:30.950 に答える