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