助けにawk!
このソリューションでは、ソートされた入力は必要ありません。最初にfileBを提供する必要があります。
awk 'NR==FNR{a[$0];next} !($0 in a)' fileB fileA
戻り値
A
C
どのように機能しますか?
NR==FNR{a[$0];next}
イディオムは、最初のファイルを後の「contains」テストのキーとして連想配列に格納するためのものです。
NR==FNR
最初のファイルをスキャンしているかどうかを確認しています。この場合、グローバル行カウンター(NR)は現在のファイル行カウンター(FNR)と同じです。
a[$0]
現在の行をキーとして連想配列に追加します。これはセットのように動作し、重複する値(キー)がないことに注意してください
!($0 in a)
現在、次のファイルに in
あり、containsテストです。ここでは、現在の行が最初のファイルの最初のステップで設定したセットにあるかどうかをチェックし!
、条件を無効にします。ここで欠けているのはアクションであり、デフォルトであり{print}
、通常は明示的に記述されていません。
これは、ブラックリストに載っている単語を削除するために使用できることに注意してください。
$ awk '...' badwords allwords > goodwords
わずかな変更で、複数のリストをクリーンアップし、クリーンなバージョンを作成できます。
$ awk 'NR==FNR{a[$0];next} !($0 in a){print > FILENAME".clean"}' bad file1 file2 file3 ...