如何用awk打印第2列及从第3列到行尾的含空格内容
问题描述
现有文件fileA.txt内容如下:
Toyota 2017 Corola Good condition Honda 2013 Civic Flat back right tire Jeep 2017 Wrangler Roof is leaking and oil needs change
期望输出第2列及之后的所有内容:
2017 Corola Good condition 2013 Civic Flat back right tire 2017 Wrangler Roof is leaking and oil needs change
使用命令awk '{print $2,$NF}' fileA.txt只能得到第2列和最后一个单词:
2017 condition 2013 tire 2017 change
原因是awk默认以空格为列分隔符,$NF仅代表最后一列(单个单词),需实现期望的输出效果。
解决方案
以下是几种实用的awk实现方式:
方法1:循环遍历输出目标字段
通过for循环从第2列遍历到最后一列,逐个输出字段:
awk '{for(i=2;i<=NF;i++) printf "%s ", $i; print ""}' fileA.txt
注:每行末尾会多一个空格,若想避免,可调整为判断最后一个字段时不加空格,写法稍复杂但更严谨。
方法2:正则替换移除首列
用正则匹配行首的第一个字段(含后续空格),将其替换为空:
awk '{sub(/^[^ ]+ /, ""); print}' fileA.txt
解释:^[^ ]+ 匹配行首非空格字符组成的首字段,加上后续的空格,sub函数将这段内容替换为空,剩余部分即为目标输出。
方法3:清空首列后处理输出
将首列设为空,再移除开头多余的空格:
awk '$1=""; print substr($0,2)' fileA.txt
解释:把$1赋值为空后,整行内容开头会多出两个空格,用substr($0,2)截取从第2个字符开始的内容,即可得到正确格式。
方法4:GNU awk专属拼接函数(兼容性有限)
如果使用GNU awk,可直接用join函数拼接目标字段:
awk '{print join($0, 2, NF, " ")}' fileA.txt
解释:join函数将第2到第NF的字段用空格拼接后输出,仅支持GNU awk环境。
内容的提问来源于stack exchange,提问作者pixel
相关产品推荐
相关产品推荐

