
結果ファイルがあります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