awk-搜索文件中的多个字符串,并存储此行中的特定单词,以便在末尾的一行中打印所有字符串

awk-搜索文件中的多个字符串,并存储此行中的特定单词,以便在末尾的一行中打印所有字符串,awk,Awk,我是这个论坛的新手,刚开始学习awk,我喜欢做以下事情 输入文件(Input.log): awk脚本(test.awk)到目前为止,我已经找到了一些字符串,并将它们存储在一行的末尾进行打印: /first/ ( aaa = $2 ) /in/ ( bbb = $1 ) /last/ ( ccc = $3 ) { print aaa " , " bbb " , " ccc } awk -f test.awk input.log 实际产量: first w

我是这个论坛的新手,刚开始学习awk,我喜欢做以下事情

输入文件(Input.log):

awk脚本(test.awk)到目前为止,我已经找到了一些字符串,并将它们存储在一行的末尾进行打印:

/first/ ( aaa = $2 )
/in/ ( bbb = $1 )
/last/ ( ccc = $3 )
{ print aaa " , " bbb " , " ccc }

awk -f test.awk input.log
实际产量:

first word of file
first word of file
first word of file
word , first , of
second line in file
second line in file
second line in file
line , second , in
third and last line
third and last line
third and last line
and , third , last
预期(需要)输出:

任何帮助和建议都是非常宝贵的


比尔。Bert

我想你是说这个,用
{}
代替
()

如果省略regex
/in/
中的空格,脚本将与包含
in
中的单词的行相匹配,但也与其他行中的
行相匹配


最后一条语句前面必须加上
END
,并且在处理整个文件时只执行一次。

您的脚本似乎使用了圆括号
()
,其中需要花括号。你说你想在末尾打印结果,但是你没有
end
块。Jonathan Leffler刚才说的和我在上面的评论中说的一样,但是他没有看到正则表达式周围缺少空格的问题。更准确地说,我没有对此进行评论:D。我对输出中重复的行数感到困惑。第一行有3次重复,但我有一种错觉,认为四种模式(
/first/
(aaa=$2)
(bbb=$1)
(ccc=$3)
)都会触发隐式的
打印$0
操作。[…时间流逝;启蒙运动罢工…]除了现有的
{print…}
(ccc=$3)
关联之外。我想,这并不能完全解释这一点,除非问题中脚本中的行距与实际使用的行距不同。非常感谢您的帮助并解释原因@JonathanLeffler脚本的每一行都有一个真实的条件,因为它们说,例如,
/first/(aaa=$2)
,它是
$0~/first/
结果的字符串串接,要么是0,要么是1,
aaa=$2
的结果是$2中的任何字符串,因此,结果是一个类似于
1word
0line
的字符串,不管是什么,它始终是一个非空字符串,然后被视为真实条件,以导致当前行的默认打印。对变量的赋值总是发生的,因此,与发布的脚本完全相同的脚本将产生问题中所示的输出。@EdMorton-谢谢。我没有想到您可以在
模式操作
行的模式部分中的术语之间进行强连接。这不是我曾经需要的东西,我不确定在很多情况下它是否有用。
first word of file
first word of file
first word of file
word , first , of
second line in file
second line in file
second line in file
line , second , in
third and last line
third and last line
third and last line
and , third , last
word , second , last
/ first / { aaa = $2 }
/ in / { bbb = $1 }
/ last / { ccc = $3 }
END { print aaa " , " bbb " , " ccc }