awkを使って一致するものがあれば印刷し、そうでなければ去る方法

awkを使って一致するものがあれば印刷し、そうでなければ去る方法

結果ファイルがありますA.tsv(区切り記号= \t)。

BC01    2551    99
BC03    2547    95
BC04    2578    99
BC05    2547    97

そしてサンプル情報を含むファイルB.tsv(区切り文字= \t):

BC01
BC04
BC02
BC03
BC05

不足している例を追加したいA.tsv(ただし、新しいファイルとして印刷)B.tsv

BC01    2551    99
BC02
BC03    2547    95
BC04    2578    99
BC05    2547    97

これまでにいくつかのawkコマンドを試しましたが、結果はありませんでした。

awk -v OFS="\t" 'NR==FNR{a[$1]=$1;next}{print $0};NR!=FNR{a[$1]=$1;next}{print $1}' B.tsv A.tsv > C.tsv

どうすればわかりますか?

答え1

これらのファイルを処理する正しい方法は、A.tsvキーを使用して辞書にデコード$1し、行全体の内容を保存し、それを使用してB.tsv値を見つけることです。

awk -v FS="\t" ' FNR == NR { arr[$1] = $0; next } 
  ( $1 in arr ){ print arr[$1]; next } { print $1 }' A.tsv B.tsv

最終結果を並べ替えるには、$1両方のファイルの内容を索引付けし、END値がない場合はキーを個別に印刷して処理する必要があります。

awk -v FS="\t" ' FNR == NR { arr[$1] = $0; next } 
  !( $1 in arr ) { arr[$1] } END { for (x in arr) print arr[x] ? arr[x] : x }' A.tsv B.tsv

関連情報