他のファイルのキー値に基づいてファイルから行を削除する方法

他のファイルのキー値に基づいてファイルから行を削除する方法

ファイル1があります。

1   a   aa
2   b   bb
3   a   aa
4   b   bb
5   a   aa
6   b   bb
7   a   aa
8   b   bb

ファイル2:

1
2
5

file1の値がfile2にあるfile1のすべての行を削除する必要があります。

答え1

sort -bたとえば、2つのファイルが最初の列でアルファベット順に並べられているとします。

$ join -v 1 file1 file2
3 a aa
4 b bb
6 b bb
7 a aa
8 b bb

これはユーティリティを使用して、最初の列がの値と一致しないすべての行をjoin抽出します。file1file2

デフォルトの動作は、join2つのファイルの最初の列に基づいてINNER JOINを生成することですが、最初のファイル-v 1からペアリングできない行を取得します。

答え2

GNUでこれを試してみてくださいawk

ソリューション1:

$ awk 'NR==FNR {a[$0]} FNR!=NR {printf("%s",!($1 in a)? $0"\n": "")}' file2 file1
3 a aa
4 b bb
6 b bb
7 a aa
8 b bb

最初の解決策はブロック!($1 in a)? $0"\n": ""内に三項演算子があり、不必要に設計されているようですprintf。私は一般的な目的でこれを言及するだけです。つまり、シナリオによっては不要な行を削除するのではなく、置き換えたい場合は空の文字列にmy_string入れることができます。my_string\n""

ソリューション2:

$ awk 'NR==FNR {a[$0]} FNR!=NR && !($1 in a) {print $0}' file2 file1

これは次のようにさらに簡素化できます。

$ awk 'NR==FNR {a[$0]} FNR!=NR && !($1 in a)' file2 file1

awkデフォルトでは、レコード全体()が印刷されるためです。$0

man awkawk特定のインストールスタイルに関係なく、優れた紹介が提供されます。サーフィン後もまだ質問がある場合は、具体的な情報をリクエストしてください。

誰かがこれを見やすくする方法を見つけると確信しています。 ;-)

答え3

awk 'NR==FNR{a[$1];next}!($1 in a){print $0}' file2 file1

出力

3   a   aa
4   b   bb
6   b   bb
7   a   aa
8   b   bb

関連情報