比较TSV文件并标记true / false

时间:2016-06-03 01:16:52

标签: bash shell

我有两个TSV文件,我尝试使用第二个TSV文件与第一个文件进行比较,看看密钥是否存在;如果是,请将第一个表中的标记为true。例如

文件1:

K1 Va1 Va2 Va3 Va4 Va5  
K2 Vb1 Vb2 Vb3 Vb4 Vb5 
K3 Vc1 Vc2 Vc3 Vc4 Vc5

文件2:

K1
K3

尝试输出:

K1 Va1 Va2 Va3 Va4 Va5 True
K2 Vb1 Vb2 Vb3 Vb4 Vb5 False
K3 Vc1 Vc2 Vc3 Vc4 Vc5 True

现在,我试图将所有True的第二个文件加入,以便它的K1 - True,K3 - True。然后我尝试将其与第一个文件连接,并用False标记空框。但我觉得这是一种可怕的方式。有没有人对如何解决这个问题有任何建议?

2 个答案:

答案 0 :(得分:1)

使用awk

可轻松解决此问题
awk 'NR == FNR{a[$0];next};{$NF = $NF OFS ($1 in a? "True": "False"); print}' file2 file1

遍历file2并将每个密钥存储在数组a中。接下来,遍历file1,根据是否在数组True中找到字段1中的键或不遵循Falsea来修改最后一列通过打印线。这会产生:

K1 Va1 Va2 Va3 Va4 Va5 True
K2 Vb1 Vb2 Vb3 Vb4 Vb5 False
K3 Vc1 Vc2 Vc3 Vc4 Vc5 True

答案 1 :(得分:0)

awk 'NR==FNR{key[$1];next}$1 in key{printf "%s - True\n",$1}' file2 file1 >tmpfile && mv tmpfile file2

应该这样做。

<强>输出

$ cat file2
K1 - True
K3 - True