たとえば、次のファイルがある場合は、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
値を再びアクティブにします。 - 新しい行を追加する
' '
か、すべてを1行に入れることができます。
答え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