如何使用 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

相關內容