Awk 如果第一个字段的值匹配,则打印连续行

Awk 如果第一个字段的值匹配,则打印连续行,awk,sed,printing,field,matching,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没有打印…这可能适合您(GNU-sed): $ awk '$1==p1{print

使用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
没有打印…

这可能适合您(GNU-sed):

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

将第一行存储在保留空间中进行比较,然后将其删除。对于以下行,将保留空间附加到当前行并比较第一个字段。如果第一个字段匹配,则恢复当前行,将其附加到保留空间并删除它(除非它是最后一行)。如果第一个字段不匹配,则恢复当前行,交换到保留空间,如果包含多行,则打印它,然后交换回保留空间,用当前行替换保留空间,并删除当前行。如果存在匹配,且当前行是最后一行,则通过使用
$ba
:a.

进行保留空间检查,即可解决边缘情况。请将输入和输出示例也张贴在代码标记中。抱歉,这不是StackOverflow的工作方式。形式为“我想做X,请给我提示和/或示例代码”的问题被认为是离题的。请访问并阅读,特别是阅读
sed -r '1h;1d;G;/^(\S+\s).*\n\1/{s/\n.*//;H;$ba;d};s/\n.*//;:a;x;/\n/p;x;h;d' file