将一个文件的前两列与另一个文件的前两列进行比较,并在输出中打印第二个文件中的值

将一个文件的前两列与另一个文件的前两列进行比较,并在输出中打印第二个文件中的值

我有两个制表符分隔的文件,文件 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

相关内容