如果第一行的值匹配,则打印连续的行

时间:2018-07-31 15:25:50

标签: awk sed printing field matching

使用grep,sed或awk,我想打印连续的两行或更多行,并在第n个字段中使用匹配的字符串。这是一个示例:

输入文件:

1 2 3 4
2 2 3 4
3 1 2 4
3 2 1 5
2 3 4 1
4 1 3 2

所需的输出:

3 1 2 4
3 2 1 5

表达式

awk '$1 == p1 {print p0} {p1 = $1; p0 = $0}' file

各种各样的作品,但是没有打印出具有匹配图案$1的最后一行...

2 个答案:

答案 0 :(得分:1)

$ awk '$1==p1{print p0 $0; p0=""; next} {p0=$0 ORS; p1=$1}' file
3 1 2 4
3 2 1 5

答案 1 :(得分:0)

这可能对您有用(GNU sed):

sed -r '1h;1d;G;/^(\S+\s).*\n\1/{s/\n.*//;H;$ba;d};s/\n.*//;:a;x;/\n/p;x;h;d' file

将第一行存储在保留空间中以进行比较,然后将其删除。对于以下各行,请将保留空间附加到当前行,然后比较前几个字段。如果前几个字段匹配,请还原当前行,将其追加到保留空间并将其删除(除非它是最后一行)。如果第一个字段不匹配,请还原当前行,交换到保留空间,如果包含多个行,则打印该行,然后换回并用当前行替换保留空间并删除当前行。如果存在匹配项,并且当前行是最后一行,则通过使用$ba:a...进入保留空间检查来解决边缘情况。