使用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
的最后一行...
答案 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...
进入保留空间检查来解决边缘情况。