ファイル1のすべてのレコードを印刷し、ファイル2と一致しないレコードを記録するにはどうすればよいですか?

ファイル1のすべてのレコードを印刷し、ファイル2と一致しないレコードを記録するにはどうすればよいですか?

aのすべての行を印刷する簡単な方法がありますfile1(出力が入力と同じ数の行を持つように)、file1の最初の項目がfile1の最初の項目と一致しないというfile1メッセージを印刷しますか?NoMatchfile2

ファイル1:

Entry1 Entry2
a 2
b 3
c 4
d 5

ファイル2:

a
b
b
a
d
d

希望の出力:

Entry1
a 2
b 3
NoMatch 4
d 5

頑張っています

join -a1 -e "NoMatch" -11 -21 -o2.1 file1 file2

file1一致しない一致しない行を維持file2し、そのような場合に「いいえ」というメッセージを表示したいのですが、これは私のすべての履歴file2(重複項目を含む)も維持するので、私が間違っているのでしょうか? 2番目のファイルがタブで区切られ、最初のファイルが空白で区切られている可能性がありますか?

すべての助けに心から感謝しています...

ベストアンサー1

awkまず読んでfile2保存して$1からseen[$1]読んでくださいfile1。 「見た」ではない場合は、$1次のように置き換えますNoMatch

awk 'FNR==NR{seen[$1]++; next}
{(FNR==1 || ($1 in seen)) || $1="NoMatch"};1' file2 file1

必要に応じて入力をソートする必要がありますjoin。まず、head残りの行からerを抽出し、次にfile1edを使用して結果を抽出する必要があります。sortjoinsortfile2

{ head -n1; sort | join -j1 -a1 -e "NoMatch" -o 2.1 1.2 - <(sort file2); } <file1

必要に応じて、uniq重複行を避けるためにすべての項目をパイプします。

{ head -n 1; sort | \
join -j1 -a1 -e "NoMatch" -o 2.1 1.2 - <(sort file2) | \
uniq; } <file1

おすすめ記事