0

次のような行のファイルが2つあります。

ファイル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の行が保持されますが、そこにも必要なfileBの$ 1、$ 2、$ 3列を取得する方法は考えられません(明らかに$ 1、$ 2、 $ 3は機能しません)。私に何ができる?

4

2 に答える 2

1

$4現在のスクリプトからは、で一意のように見えますfileB。したがって、この変更されたスクリプトを(コードに基づいて)試すことができます。

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 に答える