2

我想就我在 awk 中遇到的问题获得帮助或指导。

我有一个超过 5 个字段的制表符分隔文件。我想输出不包括前 5 个字段的字段。

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

最好的,建峰.mao

请注意以下友好评论:

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

4

4 回答 4

5

在我的制表符分隔文件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

我有一种预感,你的问题比这个要复杂一些,所以如果你回复我的评论,我可以尝试扩展我的答案。

于 2011-06-10T14:39:40.177 回答
4

我同意 matchew 的使用建议cut:它是这项工作的正确工具。但是,如果这只是要成为更大awk脚本的一部分,请按以下步骤操作:

awk -F "\t" '{ for (i=6; i<=NF; ++i) $(i-5) = $i; NF = NF-5; print; }
于 2011-06-10T14:56:26.253 回答
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
于 2011-06-10T17:20:55.060 回答
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 转义。

于 2012-04-19T02:20:07.943 回答