最初の列に基づいて2つのファイルを比較します。

最初の列に基づいて2つのファイルを比較します。

2つのファイルがありますが、最初のファイルの行のみを含め、2番目のファイルは含まれていない新しいファイルをインポートしたいと思います。例:

ファイル1:

ID      firstname        lastname
1       John             Wilkens
2       Andrea           Smith
3       Matthew          Freberg
4       Brenda           Something

ファイル2:

ID      firstname        lastname
1       John             Wilkens
2       Andrea           Willems
3       Jay              Freberg
5       Mike             Hart

出力:

ID      firstname        lastname
4       Brenda           Something

commを使ってみましたが、ID 2と3のように変更された行も表示されます。

この問題を解決するのに役立ちますか?

答え1

$ awk 'NR==FNR{a[$1]; next} FNR==1 || !($1 in a)' file2 file1
ID      firstname        lastname
4       Brenda           Something
  • NR==FNR{a[$1]; next}最初の列を使用した配列file2キーの作成
    • NRこれまでに読み取ったレコードの総数を追跡し、FNR現在読み込んでいるファイルのレコード番号のみを記録します。したがって、NR==FNR最初のファイルに対してのみ機能します(空ではないと仮定)。
  • FNR==1 || !($1 in a)ファイルの場合、file1ヘッダー行を印刷したり、配列内の最初の列が見つからない場合a
  • awk -F'\t' '...'入力がタブで区切られ、awk -F, '...'カンマで区切られた場合に使用します。

最初のファイルが空である可能性がある場合は、以下を使用してください。

awk '!f{a[$1]; next} FNR==1 || !($1 in a)' file2 f=1 file1

これにより、f2つのファイルの間にフラグが設定されます。

答え2

Bashコマンドラインから次のことができます。 file2でIDをフィルタリングし、file1で見つけます。ただし、行の先頭でのみ探してください。

$ grep -vf <(< file2 tail -n+2 | grep -Eo '^[^ ]{1,}'|sed 's/.*/^& /') file1
ID      firstname        lastname
4       Brenda           Something

関連情報