2016-09-30 110 views
0

我有两个用于比较两个文件的脚本。将两个文件中的两个文件比较为一个脚本

第一个脚本比较$ 3栏:

> awk -v OFS="\t" 'NR==FNR{a[$3]=$4;next}{$2=$2 "\t"(a[$2]?a[$2]:"-")}1' file1 file2 

第二个脚本比较$ 2栏:

> awk -v OFS="\t" 'NR==FNR{a[$2]=$4;next}{$2=$2 "\t"(a[$2]?a[$2]:"-")}1' file1 file2 

你看到一个差异
NR==FNR{a[$3]=$4;next}
NR==FNR{a[$2]=$4;next}
我想编写成一个脚本,以便像

NR==FNR{a[$2 || $3]=$4}

请你能帮助我吗? 如果你想我可以共享文件和更多信息。

INPUT: 文件1

chr1 11796320 11796321 MTHFR 
chr1 169549810 169549811 F5 
chr1 173917077 173917078 SERPINC1 
chr2 48962781 48962782 FSHR 
chr4 121696961 121696962 ANXA5 
chr4 121697010 121697011 ANXA5 
chr4 121697036 121697037 ANXA5 
chr4 121697055 121697056 ANXA5 
chr11 46739504 46739505 F2 
chr13 20189510 20189511 GJB2 
chr13 20189546 20189547 GJB2 

文件2

chr1 11796321 G 0 WILD ADP=1026 
chr1 169549811 C 0 WILD ADP=940 
chr1 173917078 C 0 WILD ADP=501 
chr2 48962782 C T HET ADP=1665 
chr4 121696962 C T HET ADP=212 
chr4 121697011 A 0 WILD ADP=184 
chr4 121697037 T 0 WILD ADP=111 
chr4 121697037 tccc 0 INDEL AINDEL 
chr4 121697056 C 0 WILD ADP=112 
chr11 46739505 G 0 WILD ADP=202 
chr13 20189511 C 0 WILD ADP=326 
chr13 20189546 AC A INDEL ADP=164 
chr13 20189547 C 0 WILD ADP=3 

OUTPUT:

chr1 11796321 MTHFR G 0 WILD ADP=1026 
chr1 169549811 F5 C 0 WILD ADP=940 
chr1 173917078 SERPINC1 C 0 WILD ADP=501 
chr2 48962782 FSHR C T HET ADP=1665 
chr4 121696962 ANXA5 C T HET ADP=212 
chr4 121697011 ANXA5 A 0 WILD ADP=184 
chr4 121697037 ANXA5 T 0 WILD ADP=111 
chr4 121697037 ANXA5 tccc 0 INDEL AINDEL 
chr4 121697056 ANXA5 C 0 WILD ADP=112 
chr11 46739505 F2 G 0 WILD ADP=202 
chr13 20189511 GJB2 C 0 WILD ADP=326 
chr13 20189546 GJB2 AC A INDEL ADP=164 
chr13 20189547 GJB2 C 0 WILD ADP=3 
+1

请提供一些合理的源文件样本和预期的输出。 –

+0

该语法无效且无意义。也许,如果只有'$ 2'或'$ 3'中的一个存在(相互排斥),则可行。当'$ 2'和'$ 3'都不为空时,你想要发生什么? – karakfa

+0

我添加了一个输入文件并输出了我想要的内容。 – Vonton

回答

1

awk来救援!

$ awk 'NR==FNR{f2[$2]=f3[$3]=$4;next} 
       {k=$2; suf=((k in f2)?f2[k]:((k in f3)?f3[k]:"-")); 
       $2=k "\t" suf}1' file{1,2} 

chr1 11796321 MTHFR G 0 WILD ADP=1026 
chr1 169549811 F5 C 0 WILD ADP=940 
chr1 173917078 SERPINC1 C 0 WILD ADP=501 
chr2 48962782 FSHR C T HET ADP=1665 
chr4 121696962 ANXA5 C T HET ADP=212 
chr4 121697011 ANXA5 A 0 WILD ADP=184 
chr4 121697037 ANXA5 T 0 WILD ADP=111 
chr4 121697037 ANXA5 tccc 0 INDEL AINDEL 
chr4 121697056 ANXA5 C 0 WILD ADP=112 
chr11 46739505 F2 G 0 WILD ADP=202 
chr13 20189511 GJB2 C 0 WILD ADP=326 
chr13 20189546 GJB2 AC A INDEL ADP=164 
chr13 20189547 GJB2 C 0 WILD ADP=3 
+0

干得好,工作得很好。谢谢 – Vonton

1

另一个awk(编辑以包括$4)也许:

awk 'FNR==NR{A[$3]=$1 FS $3 FS $4;next} ($2 in A){print A[$2],$3,$4,$5,$6}' file1 file2 

chr1 11796321 MTHFR G 0 WILD ADP=1026 
chr1 169549811 F5 C 0 WILD ADP=940 
chr1 173917078 SERPINC1 C 0 WILD ADP=501 
chr2 48962782 FSHR C T HET ADP=1665 
chr4 121696962 ANXA5 C T HET ADP=212 
chr4 121697011 ANXA5 A 0 WILD ADP=184 
chr4 121697037 ANXA5 T 0 WILD ADP=111 
chr4 121697037 ANXA5 tccc 0 INDEL AINDEL 
chr4 121697056 ANXA5 C 0 WILD ADP=112 
chr11 46739505 F2 G 0 WILD ADP=202 
chr13 20189511 GJB2 C 0 WILD ADP=326 
chr13 20189547 GJB2 C 0 WILD ADP=3 
+0

但是没有填满4美元的列表格第一档... – Vonton