0

我有两个文件,它们的行如下:

档案一:

TCONS_00000007  ENSMUST00000044158  gene:ENSMUSG00000041560 433/463 0.0 364.0
TCONS_00000009  ENSMUST00000044158  gene:ENSMUSG00000041560 1051/1122   0.0 890.0
TCONS_00000212  ENSMUST00000112323  gene:ENSMUSG00000032582 458/475 0.0 420.0
TCONS_00000636  ENSMUST00000061242  gene:ENSMUSG00000048076 1694/1751   0.0 1571.0
TCONS_00000636  ENSMUST00000163300  gene:ENSMUSG00000048076 1658/1713   0.0 1539.0

文件 B:

chr1    4675000 4675009 TCONS_00000007
chr1    4677953 4678274 TCONS_00000008
chr1    4677956 4679079 TCONS_00000009
chr1    43944821    43946606    TCONS_00000636

编辑:文件 B 中的第 4 列将是唯一的。文件 A 中的第 1 列不一定是。

我想做的是输出一个文件,这样它只会保留 A 上的第 1 列和 B 上的第 4 列匹配的行。允许重复。(所以在上面的例子中,我希望输出看起来像这样):

chr1    4675000 4675009 TCONS_00000007  ENSMUST00000044158  gene:ENSMUSG00000041560 
chr1    43944821    43946606     TCONS_00000636 ENSMUST00000061242  gene:ENSMUSG00000048076
chr1    43944821    43946606     TCONS_00000636 ENSMUST00000163300  gene:ENSMUSG00000048076

所以我尝试使用 awk 来做到这一点......我被卡住了。

FNR==NR{ ### script.awk
    array[$4]++
    next
}

{
    if ($1 in array){
        print $1,$2,$3...
    }
}
awk -f script.awk fileB fileA > fileC

我遇到的麻烦是打印部分正常工作。如您所见,这样做会保留我想要的 fileA 中的行,但我想不出一种方法来获取我也想要的 fileB 的 $1、$2、$3 列(显然输入 $1、$2、 3 美元不起作用)。我能做些什么?

4

2 回答 2

1

从您当前的脚本来看,它看起来$4fileB. 所以你可以试试这个修改后的脚本(基于你的代码):

FNR==NR{ ### script.awk
    array[$4]=$0
    next
}

{
    if ($1 in array){
        print array[$1],$1,$2,$3...
    }
}

然后

awk -f script.awk fileB fileA > fileC
于 2013-02-27T22:14:50.397 回答
0

尝试这个 :

awk '
    NR==FNR{v=$1;$1="";arr[v]=$0}
    NR!=FNR{v=$4;$4="";arr[v]=arr[v] $0}
    END{for (a in arr) print a, arr[a]}
' A B
于 2013-02-27T22:13:11.327 回答