【问题标题】:Parsing each field and process it using 'awk'/'gawk'解析每个字段并使用 'awk'/'gawk' 处理它
【发布时间】:2010-10-09 03:01:37
【问题描述】:

这是一个查询:

grep bar 'foo.txt' | awk '{print $3}'

“awk”查询发出的字段名称是错位的 C++ 符号名称。我想将每个传递给dem,最后输出“dem”的输出——即去错符号。

假设字段分隔符是' '(空格)。

【问题讨论】:

    标签: unix awk


    【解决方案1】:

    awk 是一种模式匹配语言。 grep 完全没有必要。

    awk '/bar/{print $3}' foot.txt
    

    按照你的例子做。

    编辑在阅读了前面答案中的 cmets 后稍作修正(我对dem...一无所知):

    您可以在 awk 中使用 system 调用,例如:

    awk '/bar/{cline="dem " $3; system(cline)}' foot.txt
    

    但这会为每个处理的符号生成一个dem 的实例。效率很低。

    让我们变得更聪明:

    awk '/bar/{list = list " " $3;}END{cline="dem " list; system(cline)}' foot.txt
    

    顺便说一句-- 未经测试,因为我没有 dem 或您的意见。


    另一个想法:如果您要使用其他海报提供的xargs 公式,cut 可能比awk 更有效。但是,此时您需要再次使用grep

    【讨论】:

      【解决方案2】:

      怎么样

      grep bar 'foo.txt' | awk '{ print $3 }' | xargs dem | awk '{ print $3 }'
      

      【讨论】:

      • 我阅读 dem 手册页的方式,符号名称应该在命令行而不是标准输入
      • 哎呀,我看错了。我在对 xargs 的调用中进行了编辑,应该修复它。
      • 好吧,c++ 端可以有空格:)
      • 是的,我的 c++filt 内容不适用于他的(显然)Sun mangling 风格:/。但是您可能很幸运,也许 dem 没有在 c++ 端添加空格?从示例显示的内容来看,它省略了显示返回类型,至少
      【解决方案3】:

      这将打印解构后的符号,并在方法的情况下包含参数列表:

      awk '/bar/ { print $3 }' foo.txt | xargs dem | sed -e 's:.* == ::'
      

      这将打印解构符号,没有在方法的情况下参数列表:

      awk '/bar/ { print $3 }' foo.txt | xargs dem | sed -e 's:.* == \([^(]*\).*:\1:'
      

      干杯, 五、

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-01-21
        • 2011-05-11
        • 1970-01-01
        • 2010-09-23
        • 2014-05-05
        • 2015-06-27
        • 2019-02-15
        • 1970-01-01
        相关资源
        最近更新 更多