我有两个文件包含这样的行:
档案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将无效)。我该怎么办?
答案 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