aのすべての行を印刷する簡単な方法がありますfile1
(出力が入力と同じ数の行を持つように)、file1の最初の項目がfile1の最初の項目と一致しないというfile1
メッセージを印刷しますか?NoMatch
file2
ファイル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を抽出し、次にfile1
edを使用して結果を抽出する必要があります。sort
join
sort
file2
{ 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