【问题标题】:How do I print a field from a pipe-separated file?如何从管道分隔的文件中打印字段?
【发布时间】:2010-09-17 20:24:28
【问题描述】:

我有一个文件,其中的字段由管道字符分隔,我只想打印第二个字段。此尝试失败:

$ cat file | awk -F| '{print $2}'
awk: syntax error near line 1
awk: bailing out near line 1
bash: {print $2}: command not found

有没有办法做到这一点?

【问题讨论】:

    标签: bash unix shell awk ksh


    【解决方案1】:

    或者只使用一个命令:

    cut -d '|' -f FIELDNUMBER
    

    【讨论】:

    • 请注意,问题的症结在于管道字符,而不是使用的命令。但这是一个很好的解决方案。
    • 我想过,但我宁愿有一个解释问题的答案。事实上,这就是我评论的重点。 ;-)
    • 应该是cut -d '|' -f FIELDNUMBER FILENAME
    【解决方案2】:

    这里的关键点是管道字符(|)必须转义到shell。使用“\|”或“'|'”来保护它免受 shell 的干扰,并允许它在命令行上传递给awk


    阅读 cmets 我看到原始海报提出了原始问题的简化版本,其中涉及在选择和打印字段之前过滤 file。使用了通过grep 并将结果通过管道传输到 awk 以进行字段选择。这说明了问题中出现的完全不必要的cat file(它取代了grep <pattern> file)。

    好的,那会起作用的。然而,awk 本身在很大程度上是一个模式匹配工具,无需调用grep 即可找到并处理匹配行。使用类似的东西:

    awk -F\| '/<pattern>/{print $2;}{next;}' file
    

    /&lt;pattern&gt;/ 位告诉awk 在匹配&lt;pattern&gt; 的行上执行后续操作。

    看起来丢失的{next;} 是跳到输入中的下一行的默认操作。好像没必要,不过我早就有这个习惯了……

    【讨论】:

      【解决方案3】:

      管道字符需要转义,以便 shell 不会解释它。一个简单的解决方案:

      $ awk -F\| '{print $2}' file
      

      另一种选择是引用字符:

      $ awk -F'|' '{print $2}' file
      

      【讨论】:

        【解决方案4】:

        另一种使用 awk 的方式

        awk 'BEGIN { FS = "|" } ; { print $2 }'
        

        【讨论】:

          【解决方案5】:

          并且“文件”不包含管道符号,因此它什么也不打印。您应该使用“cat 文件”或简单地在 awk 程序之后列出该文件。

          【讨论】:

          • 紧急。对于那个很抱歉。原始代码 grep 了一个文件,然后将输出通过管道传输到 awk。我清理了命令,但没有测试它。 :(
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-11-30
          • 1970-01-01
          • 2011-01-29
          • 2012-02-19
          • 2012-07-22
          • 2018-05-29
          • 1970-01-01
          相关资源
          最近更新 更多