2012-10-08 20 views
0

我不明白..這很有趣,但我不明白))awk |爲什麼長度錯了?

見下文,請

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

爲什麼非拉丁字符我得到一個不同的結果?我該如何解決它?

p.s.修復後,我需要使用substr函數,即substr(路徑,10,8);

+0

爲什麼你用'-F';',對我來說似乎沒用? – Bernhard

回答

10

你得到與非拉丁字符不同的結果,因爲有字符的字符串數和字節的數量之間的差異一個字符串。 wc -c是返回的字節數,awk是返回的字符數。

確保您使用正確的數字。如果你需要存儲字符串,你需要知道字節數。如果你需要顯示一個字符串,你可能會對字符數量更感興趣。

man wc

-c,--bytes 打印字節數

man awk

截至版本3.1.5,gawk的是多字節知道。這意味着 index(),length(),substr()和match()全部以 字符而不是字節表示。

+6

'wc -m'應該產生OP正在查找的字符數。 –

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)}'