【问题标题】:How to print out a specific field in AWK?如何打印出 AWK 中的特定字段?
【发布时间】:2012-02-27 12:11:07
【问题描述】:

一个非常简单的问题,没有找到答案。如何在 awk 中打印出特定字段?

awk '/word1/',将打印出整个句子,而我只需要一个word1。或者我需要仅从文本中打印出一系列模式 (word1 + word2)。

【问题讨论】:

  • 您能否提供一个更详细的输入示例?你想复制grep -o吗?
  • 我有一条短信“你好,我的朋友们,这些阳光明媚的日子你好吗?”。我搜索 /how are/ 字段字符串,找到它,然后 awk 用这些匹配的模式打印出整个句子。我不需要那种输出。我只需要这两个匹配的词。所以我的 awk 输入应该是这样的“怎么样”
  • 听起来像grep -o :)

标签: awk filtering


【解决方案1】:

如果模式是一个单词(你想打印它并且不能包含FS(输入字段分隔符))为什么不呢:

awk -v MYPATTERN="INSERT_YOUR_PATTERN" '$0 ~ MYPATTERN { print MYPATTERN }' INPUTFILE

如果您的模式是正则表达式:

awk -v MYPATTERN="INSERT_YOUR_PATTERN" '$0 ~ MYPATTERN { print gensub(".*(" MYPATTERN ").*","\\1","1",$0) }' INPUTFILE

如果必须在每个字段中检查您的模式:

awk -v MYPATTERN="INSERT_YOUR_PATTERN" '$0 ~ MYPATTERN { 
    for (i=1;i<=NF;i++) {
        if ($i ~ MYPATTERN) { print "Field " i " in " NR " row matches: " MYPATTERN }
    }
}' INPUTFILE

根据您的喜好修改上述任何一项。

【讨论】:

    【解决方案2】:

    awk中的字段用$1、$2等表示:

    $ echo 这是一个字符串 | awk '{ 打印 $2 }' 是

    $0 是整行,$1 是第一个字段,$2 是下一个字段(或空白), $NF 是最后一个字段,$( NF - 1 ) 是倒数第二个字段,以此类推。

    编辑(回应评论)。

    你可以试试:

    awk '/crazy/{ print substr($0, match($0, "crazy"), RLENGTH)}'

    【讨论】:

    • 我知道)我怎样才能只打印出 MATCHED 模式?我有一句话“你好,疯狂的世界”。如果找到的话,我需要找到 /crazy/ 并只打印出“crazy”这个词。
    • 我想知道“匹配模式”是否有 awk 内置变量?
    【解决方案3】:

    我知道你可以用 awk 做到这一点: 另一种选择是:

    sed -nr "s/.*(PATTERN_TO_MATCH).*/\1/p" file
    

    或者你可以使用grep -o

    【讨论】:

      【解决方案4】:

      可能是这样的:

      awk '{split("bla1 bla2 bla3",a," "); print a[1], a[2], a[3]}'
      

      【讨论】:

      • 不,我需要 awk 来仅打印匹配的“word1”。想象一下,我们有一个文本,我需要在其中找到一串单词并将其打印出来。我不需要整个句子,我只需要那个特定的链或单词。
      猜你喜欢
      • 2011-02-26
      • 1970-01-01
      • 2013-08-29
      • 1970-01-01
      • 2015-03-25
      • 2013-03-13
      • 2013-02-04
      • 2015-11-29
      相关资源
      最近更新 更多