【问题标题】:Print Field 'N' to End of Line将字段“N”打印到行尾
【发布时间】:2011-09-12 13:28:47
【问题描述】:

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

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

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

最好, 建峰.mao

请注意以下友好评论:

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

【问题讨论】:

  • 您有标准的字段集吗?还是字段数会有所不同。例如有时 6 个字段有时 10 个字段?
  • 是的,有很多字段。具有不同字段数的不同文件。不知道有多少。
  • 不要忘记接受回答您问题的答案。
  • 请允许我欢迎您来到 StackOverflow,并提醒我们通常在这里做的三件事:1) 当您获得帮助时,请尝试在您的专业领域中回答问题 2)Read the FAQs 3)当你看到好的问答时,给他们投票using the gray triangles,因为系统的可信度是基于用户通过分享他们的知识而获得的声誉。还记得接受更好地解决您的问题的答案,如果有的话,by pressing the checkmark sign

标签: linux unix awk cut gawk


【解决方案1】:

在我的制表符分隔文件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 打印到行尾。

注意-d 指定分隔符,但制表符是默认分隔符。 您可以在 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

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

【讨论】:

  • 亲爱的火柴。非常感谢您的帮助。
  • cut 非常简单,但不处理不一致的分隔符(不同空格的混合)。 +1 在awk 解决方案中使用substr。
【解决方案2】:

我同意 matchew 使用 cut 的建议:它是完成这项工作的正确工具。但是,如果这只是要成为更大的awk 脚本的一部分,那么可以这样做:

awk -F "\t" '{ for (i=6; i<=NF; ++i) $(i-5) = $i; NF = NF-5; print; }

【讨论】:

  • 尊敬的 user349433,我现在正在尝试从您的 awk 脚本中学习。非常感谢
【解决方案3】:

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

【讨论】:

    【解决方案4】:
    awk -vFS='\t' -vOFS='\t' '{
      $1=$2=$3=$4=$5=""
      print substr($0,6) # delete leading tabs
    }'
    

    我使用 -vFS='\t' 而不是 -F'\t',因为 awk 的某些实现(例如 BusyBox)不支持后一种构造中的 C 转义。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-22
      • 1970-01-01
      相关资源
      最近更新 更多