使用c&&! - c打印Awk打印匹配的行和第N行

时间:2014-09-17 21:04:14

标签: regex awk formatting

所以,我已经了解了着名的" c&&! - c" ..虽然可能没有。

当使用Awk在匹配的行之后打印第N行时,我想在同一输出行上打印第N行,一个空格,然后是匹配的行。

例如,给定文件tmpfile.txt;

blar
Matchme
blar
XXXX
blar

我想获得以下内容

XXXX Matchme

但是..使用

awk 'c&&!--c ; /Matchme/ {c=2} ; /Matchme/' tmpfile.txt

给出

Matchme
XXXX

添加printf没有帮助..

awk 'c&&!--c ; /Matchme/ {c=2} ; /Matchme/ {printf $0}' tmpfile.txt

给出

MatchmeXXXX

有人可以解释为什么第一个模式/动作最后被打印出来吗?

由于

gary_s

2 个答案:

答案 0 :(得分:2)

这应该做:

awk 'c&&!--c {print $0,f} /Matchme/ {c=2;f=$0}' file
XXXX Matchme

pattern行保存到变量f,然后在2行后打印当前行和f


awk 'c&&!--c  ; /Matchme/ {c=2} ; /Matchme/ {printf $0}'

此部分/Matchme/ {printf $0}在找到模式时是正确的,因此会打印出来 然后在两行之后它将打印XXXX

答案 1 :(得分:1)

这会产生您想要的输出:

$ awk 'c && !--c {print $0, s} /Matchme/ {s=$1; c=2}' file
XXXX Matchme

开始时的c检查会阻止第一行打印(因为在程序开始时c将评估为0)。正如in the comments所指出的那样(感谢Ed),这也意味着只有在&&为正时才会评估c的右侧。当/ Matchme /匹配时,将存储第一列的值,并从2开始倒计时。 !--c仅在c为0时才为真,因此print在匹配后会发生两行。