最初の列に基づいて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

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

答え2

bash コマンドラインでは、次のように実行できます。file2 から ID をフィルタリングし、file1 でそれらの ID を検索しますが、行の先頭のみを検索します。

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

関連情報