我有两个制表符分隔的文件,文件 A 和文件 B,我必须将文件 A 的前两列与文件 B 的前两列进行比较,并在输出中打印文件 B 中的值,如果条目不可用打印不适用。以下是我的
fileA.txt
id freq.var
chr12_56487682_56487682_T_A 0
chr3_52436344_52436344_C_G 0
chr19_9091288_9091288_G_T 0
chr12_44172075_44172075_A_C 0.05739626
chr19_9048431_9048431_A_G 0.033832938
chr12_56487678_56487678_T_G 0
chr17_37881646_37881646_T_G 0
chr19_9002576_9002576_T_C 0.0342902
chr15_63991054_63991054_T_G 0.024456501
chr17_29554589_29554589_C_T 0.095445774
fileB.txt
id freq.var
chr12_56487682_56487682_T_A 0.0035266
chr19_9048431_9048431_A_G 0.033832938
chr3_52436344_52436344_C_G 0.002500443
chr12_44172075_44172075_A_C 0.05739626
chr19_9002576_9002576_T_C 0.0342902
chr17_29554589_29554589_C_T 0.095445774
chr15_63991054_63991054_T_G 0.024456501
以下是预期结果
id freq.var
chr12_56487682_56487682_T_A 0.0035266
chr3_52436344_52436344_C_G 0.002500443
chr19_9091288_9091288_G_T NA
chr12_44172075_44172075_A_C 0.05739626
chr19_9048431_9048431_A_G 0.033832938
chr12_56487678_56487678_T_G NA
chr17_37881646_37881646_T_G NA
chr19_9002576_9002576_T_C 0.0342902
chr15_63991054_63991054_T_G 0.024456501
chr17_29554589_29554589_C_T 0.095445774
我之前发布过类似的问题根据两个文件的第一列比较两个制表符分隔的文件,并在输出文件中打印匹配和不匹配的条目
答案1
这是解析两个文件的标准用法awk
,第一个文件的操作在条件之后FNR==NR
,将值存储到哈希数组中,该next
语句意味着转到下一行而不执行任何后续操作。对于第二个文件,执行以下部分,我们使用三元,要么获取存储的值(如果存在),要么将其设置为“NA”。1
独自是print
。管道 tocolumn
以获得带有空格的类似制表符的外观。
awk 'NR==FNR{a[$1]=$2; next} {$2=($1 in a)? a[$1]: "NA"} 1' fileB.txt fileA.txt \
| column -t
输出:
id freq.var
chr12_56487682_56487682_T_A 0.0035266
chr3_52436344_52436344_C_G 0.002500443
chr19_9091288_9091288_G_T NA
chr12_44172075_44172075_A_C 0.05739626
chr19_9048431_9048431_A_G 0.033832938
chr12_56487678_56487678_T_G NA
chr17_37881646_37881646_T_G NA
chr19_9002576_9002576_T_C 0.0342902
chr15_63991054_63991054_T_G 0.024456501
chr17_29554589_29554589_C_T 0.095445774