代码之家  ›  专栏  ›  技术社区  ›  Jon Ericson Homunculus Reticulli

如何从管道分隔文件打印字段?

  •  6
  • Jon Ericson Homunculus Reticulli  · 技术社区  · 16 年前

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

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

    有办法吗?

    4 回复  |  直到 13 年前
        1
  •  9
  •   dmckee --- ex-moderator kitten    16 年前

    这里的关键是管道特性( | )必须逃到壳里。“使用” \| “或” '|' “保护它不受外壳插入,并允许它被传递到 awk 在命令行上。


    阅读评论时,我看到原始海报呈现了原始问题的简化版本,涉及过滤。 file 在选择和打印字段之前。通行证 grep 并将结果导入awk进行字段选择。这是完全不必要的原因 cat file 出现在问题中(它替换了 grep <pattern> file )

    好吧,那就行了。然而,awk在很大程度上是一个模式匹配工具,可以信任它在不需要调用的情况下查找和处理匹配行。 格雷普 . 使用如下内容:

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

    这个 /<pattern>/ 比特告诉 AWK 在匹配的行上执行以下操作 <pattern> .

    迷路的样子 {next;} 是跳到输入中的下一行的默认操作。似乎没有必要,但我很久以前就有了这个习惯…

        2
  •  17
  •   Zsolt Botykai    16 年前

    或者只使用一个命令:

    cut -d '|' -f FIELDNUMBER
    
        3
  •  3
  •   Jon Ericson Homunculus Reticulli    16 年前

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

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

    另一种选择是引用字符:

    $ awk -F'|' '{print $2}' file
    
        4
  •  0
  •   Jonathan Leffler    16 年前

    “file”不包含管道符号,因此它不打印任何内容。您应该使用“cat文件”,或者简单地在awk程序之后列出该文件。