如何在AWK中打印特定字段?

3

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

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


你能给出更详细的输入示例吗?你是在尝试复制 grep -o 的功能吗? - johnsyweb
我有一个文本:“Hello my friends, how are you doing these sunny days?”。我搜索“how are”字符串字段,找到它后,awk会打印出整个包含这些匹配模式的句子。但我不需要那种输出,我只需要这两个匹配的单词。因此,我的awk输入应该是这样的:“how are”。 - user1191129
3
听起来就像是 grep -o :) - johnsyweb
4个回答

4

如果模式是单个单词(您想打印并且不包含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 this is a string | awk '{ print $2 }'
is

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

编辑(回应评论)。

你可以尝试:

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

1
我知道如何仅打印匹配的模式。我有一个句子“Hello, crazy world”。如果找到/crazy/,我需要找到并仅打印出单词“crazy”。 - user1191129
我想知道awk是否有一个内置变量来表示“匹配的模式”? - user1191129

1

我知道你可以用awk做到这一点:

另一种选择是:

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

或者你可以使用 grep -o


0

也许是这样的:

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

不,我需要awk仅打印匹配的“word1”。想象一下我们有一个文本,在其中我需要查找一系列单词并将其打印出来。我不需要整个句子,我只需要那个特定的链或单词。 - user1191129

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接