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

関連情報