正規表現を使用してリストから特定の繰り返し文字を削除できますか?

正規表現を使用してリストから特定の繰り返し文字を削除できますか?

約100行を含む列のリストがあり、その一部は重複しています。私の意図は削除することです。特定行を複製してのみ保持一つコピーされますが、他の行は変更されません。

私が作業しているファイルから抜粋:

V(Mn9)   
V(C1,H3) 
V(Mn6)   
V(Mn6)   
V(C4,H6) 
V(Mn9)   
V(Mn9)   
V(C1,Mn6)
V(C4,Mn9)
V(Mn6)   
V(C1,C4) 
C(Mn9)   
C(Mn6)   
C(C1)    
C(C4)    
C(Mn9)   
C(Mn6)   
V(C1,H2) 
V(Mn9)   
V(Mn6)   
V(C4,H5)

私の目的は、C(Xx0-9)を含むすべての重複行を削除し、その1つを維持し、V(Xxx..)を維持することです。

私が探している結果:

V(Mn9)   
V(C1,H3) 
V(Mn6)   
V(Mn6)   
V(C4,H6) 
V(Mn9)   
V(Mn9)   
V(C1,Mn6)
V(C4,Mn9)
V(Mn6)   
V(C1,C4) 
C(C1)    
C(C4)    
C(Mn9)   
C(Mn6)   
V(C1,H2) 
V(Mn9)   
V(Mn6)   
V(C4,H5)

私は次のコマンドを使用しました。

sed '0,/C(Mn9)/{/C(Mn9)/d}' inputfile.txt | sed '0,/C(Mn6)/{/C(Mn6)/d}'

うまくいきますが、C(Xx1-50)が多く、正規表現を使いたいのですが、方法がわからないため、ファイル全体には十分ではありません。だからあなたの助けが必要です。

答え1

$ awk '!(/^C\(..[0-9])$/ && seen[$0]++)' file
V(Mn9)
V(C1,H3)
V(Mn6)
V(Mn6)
V(C4,H6)
V(Mn9)
V(Mn9)
V(C1,Mn6)
V(C4,Mn9)
V(Mn6)
V(C1,C4)
C(Mn9)
C(Mn6)
C(C1)
C(C4)
V(C1,H2)
V(Mn9)
V(Mn6)
V(C4,H5)

上記は、サンプル入力で表示される文字の前後にスペースがないと想定しています。その場合は、次のように削除してください。

$ awk '{gsub(/^[[:space:]]+|[[:space:]]+$/,"")} !(/^C\(..[0-9])$/ && seen[$0]++)' file
V(Mn9)
V(C1,H3)
V(Mn6)
V(Mn6)
V(C4,H6)
V(Mn9)
V(Mn9)
V(C1,Mn6)
V(C4,Mn9)
V(Mn6)
V(C1,C4)
C(Mn9)
C(Mn6)
C(C1)
C(C4)
V(C1,H2)
V(Mn9)
V(Mn6)
V(C4,H5)

答え2

sed以前に表示されたことを確認するには、予約済みスペースの収集行を使用することをお勧めします。

 sed -n 'H;G;/^\(C([^)]*)\).*\1 *\n/!P'
  • H現在行を予約済みスペースに追加
  • G私たちが見たすべての行があるパターンスペースに予約されたスペースを追加します。
  • C([^)]*)は行の先頭に固定するC(…)パターンの 1 つで、後で参照できるように囲まれています。最後に新しく追加された行と一致することを避けるために、改行(空白の後ろ)を含むパターンが必要です。したがって、パターン全体は重複項目を含む行と一致するため、これが一致しない場合にのみ^\(…\)\1\1 *\n/^\(C([^)]*)\).*\1 *\n/C(…)!
  • P-n最初の改行前のすべての内容を印刷します(=追加の予約スペースはありません)。一方、このオプションはデフォルト出力を抑制します。

バージョンとファイルのサイズによっては、sed時間の経過とともにすべての行がメモリに保存されるため、この操作は失敗する可能性があります。

関連情報