3

我正在尝试组合两个列表,通过一个公共字段(例如 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
4

1 回答 1

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 进一步处理输出。对于“n/a”行,它将打印“NONE”,但您可以这样做来消除它们:

<(sort -k 2,2 gar2.txt | grep -v 'n/a$')

编辑:

这是我在没有sedand的情况下得到的输出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

除了订单之外,它与您的示例输出相匹配。如果您需要保留订单,则可以这样做。

于 2010-09-16T17:14:26.903 回答