脚本:如何根据匹配列将文件中的行放在一起?

时间:2013-02-27 22:07:24

标签: linux bash scripting awk

我有两个文件包含这样的行:

档案A:

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的行,但我想不出一种方法来获取我想要的$ 1,$ 2,$ 3列的fileB(显然输入$ 1,$ 2, $ 3将无效)。我该怎么办?

2 个答案:

答案 0 :(得分:1)

从您当前的脚本看来$4中的fileB是唯一的。{1}}。所以你可以尝试这个修改过的脚本(基于你的代码):

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

答案 1 :(得分: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