我正在尝试组合两个列表,通过诸如ENST00000371026之类的公共字段加入它们。我试过以下但没有运气。实际的方法是什么?
cat> gar1.txt <<EOF
ENST00000371026 ENSG00000152763
ENST00000371023 ENSG00000152763
ENST00000395250 ENSG00000152763
ENST00000309502 ENSG00000163485
ENST00000377464 ENSG00000142599
ENST00000400908 ENSG00000142599
ENST00000337907 ENSG00000142599
ENST00000400907 ENSG00000142599
ENST00000401087 ENSG00000179571
EOF
cat> gar2.txt <<EOF
DDX11L1 ENST00000371026
DDX11L9 ENST00000309502
DDX11L1 ENST00000371026
OR4F5 ENST00000377464
DQ597235 n/a
DQ599768 n/a
LOC388312 ENST00000401087
LOC100132287 ENST00000425496
LOC100132287 ENST00000425496
EOF
join -t"\t" -2 2 -1 1 gar1.txt gar2.txt
示例输出为:
DDX11L1 ENSG00000152763
DDX11L9 ENSG00000163485
OR4F5 ENSG00000142599
LOC388312 ENSG00000179571
LOC100132287 NONE
答案 0 :(得分:3)
尝试一下:
join -a 2 -t $'\t' -2 2 -1 1 -o 2.1 1.2 <(sort gar1.txt) <(sort -k 2,2 gar2.txt) | sed '/\t$/ s/$/NONE/' | uniq
它使用Bash进程替换(<()
),但如果您不想使用它,则可以简单地预先分配文件。您的join
版本需要-o
选项,或者您可以使用awk进一步处理输出。对于“不适用”行,它将打印“无”,但您可以这样做以消除它们:
<(sort -k 2,2 gar2.txt | grep -v 'n/a$')
修改强>
这是我在没有sed
和uniq
的情况下获得的输出:
DDX11L9 ENSG00000163485
DDX11L1 ENSG00000152763
DDX11L1 ENSG00000152763
OR4F5 ENSG00000142599
LOC388312 ENSG00000179571
LOC100132287
LOC100132287
DQ597235
DQ599768
这就是我得到的东西:
DDX11L9 ENSG00000163485
DDX11L1 ENSG00000152763
OR4F5 ENSG00000142599
LOC388312 ENSG00000179571
LOC100132287 NONE
DQ597235 NONE
DQ599768 NONE
添加grep
:
DDX11L9 ENSG00000163485
DDX11L1 ENSG00000152763
OR4F5 ENSG00000142599
LOC388312 ENSG00000179571
LOC100132287 NONE
与您的示例输出匹配,但订单除外。如果您需要保留订单,则可以这样做。