web-dev-qa-db-ja.com

2つのファイル列を比較する

スペースで区切られたフィールドを持つ長いテキストファイルがあります。

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つの列があります。両方のファイル($1file1.txt)の最初の列(file2.txt)を比較し、file2.txtで一致しなかったファイルを出力します。

私が試してみました

join -v1 file1.txt file2.txt >output.txt

しかし、出力にはいくつかのエラーがあります。任意のawk/sedコマンドを使用してください。

6
jack

joinを使用するには、結合フィールドでFILE1とFILE2がsortedであることを確認する必要があります。

次のコマンドでうまくいくはずです。

join -v1 <(sort file1.txt) <(sort file2.txt)
9
dogbane

このように、しかしそれはヘッダー行を含みません:

$ awk '{print $1}' file2.txt | grep -vf - file1.txt
44888 56565 45554 6868
77765 88688 87464 6848

注:説明ではなく、出力例と一致するように調整しました。逆にしたい場合は、file1とfile2を切り替えます。

これを分解すると:

  • awkfile2.txtのフィールド1のみを出力します
  • grep -vは一致を反転します(一致しない行を出力します)
  • -f -は、grepからパイプされた一致パターンのリストをファイルから読み取るようにSTDINに指示します。この場合は-awk)です。
5
bahamat