我想使用 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