約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
時間の経過とともにすべての行がメモリに保存されるため、この操作は失敗する可能性があります。