スペースで区切られたフィールドを持つ長いテキストファイルがあります。
cat file1.txt
Id leng sal mon
25671 34343 56565 5565
44888 56565 45554 6868
23343 23423 26226 6224
77765 88688 87464 6848
66776 23343 63463 4534
cat file2.txt
Id number
25671 34343
76767 34234
23343 23423
66776 23343
cat output.txt
Id leng sal mon
44888 56565 45554 6868
77765 88688 87464 6848
file1.txt
には4つの列があり、file2.txt
には2つの列があります。両方のファイル($1
、file1.txt
)の最初の列(file2.txt
)を比較し、file2.txt
で一致しなかったファイルを出力します。
私が試してみました
join -v1 file1.txt file2.txt >output.txt
しかし、出力にはいくつかのエラーがあります。任意のawk
/sed
コマンドを使用してください。
join
を使用するには、結合フィールドでFILE1とFILE2がsortedであることを確認する必要があります。
次のコマンドでうまくいくはずです。
join -v1 <(sort file1.txt) <(sort file2.txt)
このように、しかしそれはヘッダー行を含みません:
$ awk '{print $1}' file2.txt | grep -vf - file1.txt
44888 56565 45554 6868
77765 88688 87464 6848
注:説明ではなく、出力例と一致するように調整しました。逆にしたい場合は、file1とfile2を切り替えます。
これを分解すると:
awk
はfile2.txt
のフィールド1のみを出力しますgrep -v
は一致を反転します(一致しない行を出力します)-f -
は、grep
からパイプされた一致パターンのリストをファイルから読み取るようにSTDIN
に指示します。この場合は-
(awk
)です。