我想就我在 awk 中遇到的问题获得帮助或指导。
我有一个超过 5 个字段的制表符分隔文件。我想输出不包括前 5 个字段的字段。
你能告诉我如何编写一个 awk 脚本来完成这个任务吗?
最好的,建峰.mao
请注意以下友好评论:
我的文件中有很多字段。不同的行有不同数量的字段。每行的字段数不是标准的。
在我的制表符分隔文件temp.txt
中,它如下所示
字段
1 字段
2 字段3 字段4 字段5 字段6 字段1 字段2 字段3 字段4 字段5 字段6 字段7 字段1 字段2 字段3 字段4 字段5 字段6 字段7 字段8
根据您的更新,我强烈建议使用cut
:
cut -f6- temp.txt
将 field6 打印到行尾。
Note-d
指定分隔符,但 tab 是默认分隔符。您可以在 中执行此操作awk
,但我发现cut
更简单。
看起来awk
像这样:
awk '{print substr($0, index($0, $6))}' temp.txt
如果我的制表符分隔文件 temp.txt 如下所示
字段
1 字段
2 字段3 字段4 字段5 字段6 字段1 字段2 字段3 字段4 字段5 字段6 字段7 字段1 字段2 字段3 字段4 字段5 字段6 字段7 字段8
awk -F"\t" '{print $6}' temp.txt
将仅打印第 6 个字段。如果分隔符是制表符,它可能会在不设置 -F 的情况下工作,但我喜欢尽可能设置我的字段分隔符。
同样,也会削减。
cut -f6 temp.txt
我有一种预感,你的问题比这个要复杂一些,所以如果你回复我的评论,我可以尝试扩展我的答案。
我同意 matchew 的使用建议cut
:它是这项工作的正确工具。但是,如果这只是要成为更大awk
脚本的一部分,请按以下步骤操作:
awk -F "\t" '{ for (i=6; i<=NF; ++i) $(i-5) = $i; NF = NF-5; print; }
perl 方式?
perl -lane 'splice @F,0,5;print "@F"'
所以,
echo 'field1 field2 field3 field4 field5 field6' | perl -lane 'splice @F,0,5;print "@F"'
会产生
field6
awk -vFS='\t' -vOFS='\t' '{
$1=$2=$3=$4=$5=""
print substr($0,6) # delete leading tabs
}'
我使用-vFS='\t'
而不是-F'\t'
因为awk 的某些实现(例如BusyBox)在后一种构造中不支持C 转义。