awk加入两个文件并删除相同的列

时间:2013-10-31 10:21:52

标签: awk

我有两个文件,第一个文件包含:

  rs1210110 1:14096821  C   ENSG00000116731 ENST00000505823 Transcript 
  rs1210110 1:14096821  C   ENSG00000116731 ENST00000491815 Transcript  
  rs1210110 1:14096821  C   ENSG00000116731 ENST00000343137 Transcript
  rs2746462 2:17380497  T   ENSG00000117118 ENST00000485515 Transcript
  rs2746462 2:17380497  T   ENSG00000117118 ENST00000375499 Transcript
  rs3219489 2:45797505  G   ENSG00000132781 ENST00000525160 Transcript

第二个文件包含:

chr1    14096821    rs1210110   T   C   100.00  PASS    DP=89
chr2    17380497    rs2746462   G   T   100.00  PASS    DP=158

我想将它加入一个文件,其中

    chr1 14096821 rs1210110 T C 100.00 PASS DP=89  ENSG00000116731  ENST00000505823 Transcript  
    chr1 14096821 rs1210110 T C 100.00 PASS DP=89  ENSG00000116731  ENST00000491815 Transcript
    chr1 14096821 rs1210110 T C 100.00 PASS DP=89  ENSG00000116731  ENST00000343137 Transcript
    chr2 17380497 rs2746462 G T 100.00 PASS DP=158 ENSG00000117118  ENST00000485515 Transcript
    chr2 17380497 rs2746462 G T 100.00 PASS DP=158 ENSG00000117118  ENST00000375499 Transcript
    chr2 17380497 rs2746462 G G 100.00 PASS DP=158 ENSG00000132781  ENST00000525160 Transcript

比,第二个文件包含第三列rs代码,在第一列的第一个文件中相同。但是第二个文件中的一行可能会有来自第一个文件的更多行,但具有相同的rs代码。第一个文件的第三列将在第5列的输出中。

2 个答案:

答案 0 :(得分:1)

使用join加入,awk重新排序。

$ cat f1
rs1210110 1:14096821  C   ENSG00000116731 ENST00000505823 Transcript 
rs1210110 1:14096821  C   ENSG00000116731 ENST00000491815 Transcript  
rs1210110 1:14096821  C   ENSG00000116731 ENST00000343137 Transcript
rs2746462 2:17380497  T   ENSG00000117118 ENST00000485515 Transcript
rs2746462 2:17380497  T   ENSG00000117118 ENST00000375499 Transcript
rs3219489 2:45797505  G   ENSG00000132781 ENST00000525160 Transcript
$ cat f2
chr1    14096821    rs1210110   T   C   100.00  PASS    DP=89
chr2    17380497    rs2746462   G   T   100.00  PASS    DP=158
$ join -1 1 -2 3 f1 f2 | awk '{print $7, $8, $1, $9, $10, $11, $12, $13, $4, $5, $6}'
chr1 14096821 rs1210110 T C 100.00 PASS DP=89 ENSG00000116731 ENST00000505823 Transcript
chr1 14096821 rs1210110 T C 100.00 PASS DP=89 ENSG00000116731 ENST00000491815 Transcript
chr1 14096821 rs1210110 T C 100.00 PASS DP=89 ENSG00000116731 ENST00000343137 Transcript
chr2 17380497 rs2746462 G T 100.00 PASS DP=158 ENSG00000117118 ENST00000485515 Transcript
chr2 17380497 rs2746462 G T 100.00 PASS DP=158 ENSG00000117118 ENST00000375499 Transcript

答案 1 :(得分:1)

全部在awk

完成
cat f1
rs1210110 1:14096821  C   ENSG00000116731 ENST00000505823 Transcript
rs1210110 1:14096821  C   ENSG00000116731 ENST00000491815 Transcript
rs1210110 1:14096821  C   ENSG00000116731 ENST00000343137 Transcript
rs2746462 2:17380497  T   ENSG00000117118 ENST00000485515 Transcript
rs2746462 2:17380497  T   ENSG00000117118 ENST00000375499 Transcript
rs3219489 2:45797505  G   ENSG00000132781 ENST00000525160 Transcript


cat f2
chr1    14096821    rs1210110   T   C   100.00  PASS    DP=89
chr2    17380497    rs2746462   G   T   100.00  PASS    DP=158


awk 'FNR==NR {a[$2]=$0;next} {split($2,b,":");print a[b[2]],$4,$5,$6 }' OFS="\t" f2 f1
chr1    14096821    rs1210110   T   C   100.00  PASS    DP=89   ENSG00000116731 ENST00000505823 Transcript
chr1    14096821    rs1210110   T   C   100.00  PASS    DP=89   ENSG00000116731 ENST00000491815 Transcript
chr1    14096821    rs1210110   T   C   100.00  PASS    DP=89   ENSG00000116731 ENST00000343137 Transcript
chr2    17380497    rs2746462   G   T   100.00  PASS    DP=158  ENSG00000117118 ENST00000485515 Transcript
chr2    17380497    rs2746462   G   T   100.00  PASS    DP=158  ENSG00000117118 ENST00000375499 Transcript
        ENSG00000132781 ENST00000525160 Transcript

最后一行没有匹配,所以它将打印出来,前面没有任何信息。如果需要,可以将其删除。


使用awk

的一些不同方法
awk -F"[ \t:]*" 'FNR==NR {a[$2]=$0;next} {print a[$3],$5,$6,$7 }' OFS="\t" f2 f1