AWK处理时拾取多余EOF字符,如何让其忽略该字符?
解决AWK记录末尾多余字符导致NF异常的问题
先看实际场景中的命令与输出:
执行命令:
echo one two three | awk 'BEGIN {RS=" "; FS=""} {print NF}'
输出结果:
3 3 6
再查看每条记录的最后字段:
echo one two three | awk 'BEGIN {RS=" "; FS=""} {print $NF}'
输出结果:
e o e
问题原因
这并非EOF字符导致,而是echo命令默认会在输出内容末尾添加换行符。当你把AWK的记录分隔符RS设为空格时,最后一条记录实际是three\n(three加换行符)。由于字段分隔符FS设为空字符串,每个字符都会被拆成单独字段,换行符也会被算作一个字段,three本身有5个字符,加换行符后总共6个字段,所以NF显示为6。
解决方法
提供几种可行的处理方式:
- 方式1:用printf替代echo避免末尾换行
printf默认不会在输出末尾添加换行符,直接输出指定内容:
printf "one two three" | awk 'BEGIN {RS=" "; FS=""} {print NF}'
执行后输出:
3 3 5
- 方式2:修改RS同时匹配空格和换行
把记录分隔符设为匹配空格或换行,让换行符被当作记录分隔符而非记录内容:
echo one two three | awk 'BEGIN {RS="[ \n]"; FS=""} {if(NF>0) print NF}'
这里if(NF>0)是为了过滤掉换行符产生的空记录,输出结果与方式1一致。
- 方式3:在AWK中移除记录末尾的换行符
通过sub函数去掉每条记录末尾的换行符后再计算字段数:
echo one two three | awk 'BEGIN {RS=" "; FS=""} {sub(/\n$/,"",$0); print NF}'
同样能得到正确的字段计数结果。
内容的提问来源于stack exchange,提问作者Gil Tomás
相关产品推荐
相关产品推荐

