
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