awk | 为什么长度错了?

Ant*_*sov 1 linux awk gawk

我不明白..这很有趣,但我不明白))

请看下面

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

输出是35.这是对的

echo -n '\\prj\prj.prjjmbr.Interp\PRIL_35.jpg' | wc -c
Run Code Online (Sandbox Code Playgroud)

输出是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)}'
Run Code Online (Sandbox Code Playgroud)

输出是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
Run Code Online (Sandbox Code Playgroud)

输出是237.

为什么非拉丁符号我会得到不同的结果?我怎么解决它?

ps修复后,我需要使用substr函数,即substr(path,10,8);

Pet*_*ren 11

使用非拉丁符号会得到不同的结果,因为字符串中的字符数与字符串中的字节数之间存在差异.wc -c返回字节数,awk返回字符数.

确保使用正确的号码.如果需要存储字符串,则需要知道字节数.如果需要显示字符串,则可能对字符数更感兴趣.

来自man wc:

-c, - byte打印字节计数

来自man awk:

从版本3.1.5开始,gawk具有多字节意识.这意味着index(),length(),substr()和match()都可以按字符而不是字节工作.

  • `wc -m`应该产生OP正在寻找的字符数. (6认同)