同じパターンで始まる連続行を削除するには、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値を再びアクティブにします。
  • 新しい行を追加する' 'か、すべてを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

関連情報