【问题标题】:Print consecutive lines if the values of their first fields are matching如果第一个字段的值匹配,则打印连续行
【发布时间】:2019-01-08 01:27:58
【问题描述】:

使用 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 的最后一行...

【问题讨论】:

标签: awk sed printing field matching


【解决方案1】:
$ awk '$1==p1{print p0 $0; p0=""; next} {p0=$0 ORS; p1=$1}' file
3 1 2 4
3 2 1 5

【讨论】:

    【解决方案2】:

    这可能对你有用(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... 进行保持空间检查来解决边缘情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-29
      • 1970-01-01
      • 1970-01-01
      • 2021-04-30
      • 1970-01-01
      • 2023-03-07
      相关资源
      最近更新 更多