ファイル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
抽出します。file1
file2
デフォルトの動作は、join
2つのファイルの最初の列に基づいて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 awk
awk
特定のインストールスタイルに関係なく、優れた紹介が提供されます。サーフィン後もまだ質問がある場合は、具体的な情報をリクエストしてください。
誰かがこれを見やすくする方法を見つけると確信しています。 ;-)
答え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