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

相关内容