我有一个这样的文件:
head allGenes.txt
ENSG00000128274
ENSG00000094914
ENSG00000081760
ENSG00000158122
ENSG00000103591
...
而且我在当前目录中有多个名为* .v7.egenes.txt的文件。例如,一个文件如下所示:
head Stomach.v7.egenes.txt
ENSG00000238009 RP11-34P13.7 1 89295 129223 - 2073 1.03557 343.245
ENSG00000237683 AL627309.1 1 134901 139379 - 2123 1.02105 359.907
ENSG00000235146 RP5-857K21.2 1 523009 530148 + 4098 1.03503 592.973
ENSG00000231709 RP5-857K21.1 1 521369 523833 - 4101 1.07053 559.642
ENSG00000223659 RP5-857K21.5 1 562757 564390 - 4236 1.05527 595.015
ENSG00000237973 hsa-mir-6723 1 566454 567996 + 4247 1.05299 592.876
我想从所有* .v7.egenes.txt文件中获取与allGenes.txt中的任何条目匹配的行
我尝试使用:
grep -w -f allGenes.txt *.v7.egenes.txt > output.txt
但这需要永远完成。有没有办法在awk中执行此操作?
在不知道文件大小的情况下,但是假设主机有足够的内存来容纳allGenes.txt
在内存中,我awk
想到了一种解决方案:
awk 'NR==FNR { gene[$1] ; next } ( $1 in gene )' allGenes.txt *.v7.egenes.txt > output.txt
哪里:
NR==FNR
-此测试仅匹配要处理的第一个文件(allGenes.txt
)gene[$1]
-将每个基因作为索引存储在关联数组中next
停止处理并转到文件中的下一行$1 in gene
-适用于所有其他文件中的所有行;如果发现第一个字段是我们关联数组中的索引,那么我们将打印当前行我不希望它的运行速度快于grep
OP当前正在使用的解决方案的速度(特别是在避难所建议使用-F
而不是的情况下-w
),但是测试和查看它应该相对较快。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句