我有两个 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 - 真,K3 - 真。然后我尝试将其与第一个文件连接,并使用 False 标记空框。但我觉得这是一种糟糕的方式。有人对如何解决这个问题有任何建议吗?
这
很容易用awk
awk 'NR == FNR{a[$0];next};{$NF = $NF OFS ($1 in a? "True": "False"); print}' file2 file1
循环访问file2
并将每个键存储在数组a
中。接下来,循环访问file1
,通过附加True
或False
来修改最后一列,具体取决于字段 1 中的键是否在数组中找到 a
然后打印该行。这会产生:
K1 Va1 Va2 Va3 Va4 Va5 True
K2 Vb1 Vb2 Vb3 Vb4 Vb5 False
K3 Vc1 Vc2 Vc3 Vc4 Vc5 True
awk 'NR==FNR{key[$1];next}$1 in key{printf "%s - Truen",$1}' file2 file1 >tmpfile && mv tmpfile file2
应该这样做。
输出
$ cat file2
K1 - True
K3 - True