使用 awk 或 sed 删除以相同模式开头的连续行

使用 awk 或 sed 删除以相同模式开头的连续行

我想使用 sed 或 awk 删除以相同模式“CREATE CURRENT”开头的连续行,例如,如果有以下文件:

CREATE CURRENT = 'aaaa' ;
CREATE CURRENT = 'bbbb' ;
CREATE CURRENT = 'aaaa' ;
CREATE CURRENT = 'dddd' ;
THIS IS A PARAGRAPH 1 ;
THIS IS A PARAGRAPH 1-1
CREATE CURRENT = 'cccc' ;
THIS IS A PARAGRAPH 2 ;
THIS IS A PARAGRAPH 2-2

结果会像

CREATE CURRENT = 'dddd' ;
THIS IS A PARAGRAPH 1 ;   
THIS IS A PARAGRAPH 1-1 
CREATE CURRENT = 'cccc' ;
THIS IS a PARAGRAPH 2
THIS IS a PARAGRAPH 2-2 ;

答案1

尝试

awk '{ if ( $1 "x" != before "x" ) print ; before=$1 ; } ' file

在哪里

  • $1 "x" != before "x"使用第一个字段的先前值进行测试
  • before "x"隐式字符串连接允许未初始化的先于值
  • before=$1记住之前的 1 美元价值。

更新OP的编辑:

awk 'BEGIN {cc=0 } 
    /CREATE CURRENT/ { if ( !cc++) print ; else next ;} 
    {cc=0; print ;} '
  • 连续的行CREATE CURRENT仅打印一次
  • 其他线路重新激活cc价值
  • 您可以在其中添加新行' '或将所有内容放在一行中。

答案2

我尝试了这个 sed 并且它可以工作

sed '/^CREATE CURRENT/ { :a $! { N; /\nCREATE CURRENT/ { s/.*\n//; ba; }; }; }' file

这是结果

CREATE CURRENT = 'dddd' ;
THIS IS A PARAGRAPH 1 ;
THIS IS A PARAGRAPH 1-1
CREATE CURRENT = 'cccc' ;
THIS IS A PARAGRAPH 2 ;
THIS IS A PARAGRAPH 2-2

答案3

打开它vi,您可以使用:

:%s/\(\(\_^CREATE CURRENT\).*\n\)\(\2.*\n\)*/\1/g

如果文件末尾有行,这可能会在文件末尾留下额外的换行符CREATE CURRENT。如果是这样,您可以使用 删除多余的行:$d

如果您对此感到满意,请使用 保存它:x,或者使用 放弃更改并退出:q!


要保留每组重复项中的最后一个而不是第一个,请使用:

:%s/\(\(\_^CREATE CURRENT\).*\n\)\+\(\2.*\n\)/\3/g

相关内容