当接下来的三行(或多于)相同的行连续出现时,如何在文本文件中显示一行

当接下来的三行(或多于)相同的行连续出现时,如何在文本文件中显示一行

示例文件内容:

display this line
1111 aaaa
1111 aaaa
1111 aaaa
1111 aaaa
don't display this line
1111
1111

输出应该是display this line

答案1

在扩展正则表达式模式下使用 GNU sed:

$ sed -Ene '
    $!N;$!N;$d
    /^(.*)(\n\1){2}$/!D
    n;p
' file
display this line

在图案空间中随时保持3条线。继续从模式空间中切掉顶行,直到我们看到模式空间中的所有 3 行都相同,或者我们遇到 eof ,为此我们关闭商店并退出。

答案2

看来你完全改变了问题。 GNU sed

sed -nre '
    $!N
    :loop
        $bend
        N
     /(\n[^\n]*)\1$/bloop
     :end;h;s/(.*)\n.*/\1/
     s/^//;treset
     :reset;s/\n/&/3;g;TD
     P;s/.*\n/\n/;:D;D
' file
 display this line 

答案3

uniq -c在这里很有帮助:

$ uniq -c file | tac | awk '$1 >= 3 {getline; print substr($0, 9)}' | tac
display this line
  1. 计算连续的相同行
  2. 反转输出
  3. 找到具有所需重复次数的行
    • 获取下一行并在没有计数的情况下打印它
  4. 再次反转输出

一个问题:如果你的文件包含怎么办

a
bbb
bbb
bbb
ccc
ccc
ccc
d

你要输出吗a bbb

相关内容