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 回答