【问题标题】:misuse field separators in awk在 awk 中滥用字段分隔符
【发布时间】:2016-10-22 04:53:02
【问题描述】:

我想提取文本中Pages:后面的数字如

Tagged:         no
Form:           none
Pages:          3
Encrypted:      no

以下 awk 命令效果不佳,因为它在 3 之前有空格

$ awk -F': ' '$1=="Pages" {print $2}' 
         3

同时

awk -F'[: ]' '$1=="Pages" {print $2}' 

什么都没有,我想我指定了两个可能的字符作为字段分隔符。

那么如何使用 awk 来提取 Pages: 之后的数字而不使用前面的空格?谢谢。

【问题讨论】:

  • grep 'Pages:' input.txt | awk '{print $2}' 混合使用 grep 和 awk 对你有用吗?
  • @sisanared 相当于awk '/Pages:/ { print $2 }' input.txt

标签: awk


【解决方案1】:

看起来你需要告诉 awk 它不止一个字符:

awk -F'[: ]+' '$1=="Pages" {print $2}'

注意正则表达式中的+

【讨论】:

    【解决方案2】:

    -F'[: ]+' 不对。尽管在这种情况下有效,但如果有空字段则不会。要使用的正确分隔符是': +'。请参阅下面的示例

    $ echo "a:  : b" | awk -F'[: ]+' '{print NF}'
    2
    
    $ echo "a:  : b" | awk -F': +' '{print NF}'
    3
    

    这应该可以解决您的问题。

    $ awk -F': +' '/^Pages/{print $2}' file
    

    【讨论】:

      【解决方案3】:

      你可以试试这个;

      awk -F': ' '$1=="Pages" {gsub(/ /, "", $2); print $2} '
      

      【讨论】:

        【解决方案4】:

        为什么要打扰-F,只是:

        $ awk '/^Pages/{print $2}' foo
        3
        

        编辑:哦,@BenjaminW。已经在commects中提出了这个建议。道具++。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-12-02
          • 2014-10-14
          • 1970-01-01
          • 1970-01-01
          • 2013-03-17
          • 2019-02-20
          • 1970-01-01
          相关资源
          最近更新 更多