将字段'N'打印到行尾

时间:2011-06-10 14:30:14

标签: linux unix awk cut gawk

我想对我在awk中遇到的问题提供帮助或指导。

我有一个包含超过5个字段的制表符分隔文件。我想输出除前5个字段之外的字段。

你能告诉我如何写一个awk脚本来完成这个任务吗?

最佳, jianfeng.mao

请注意以下类型的评论:

我的文件中有很多字段。不同的行具有不同数量的字段。每行的字段数不是标准的。

4 个答案:

答案 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转义。