【发布时间】:2016-12-22 15:26:58
【问题描述】:
我正在尝试使用awk 来查找file2 中的所有$2 值,即~30MB,它们在file1 中的$2 和$3 之间,即~2GB。如果$2 的file2 中的值介于file1 字段之间,则它与file1 中的$6 值一起打印。 file1 和 file2 都是 tab-delimited 以及 desired output。如果没有要打印的内容,则处理下一行。下面的awk 运行但非常慢(已处理约 1 天但仍未完成)。有没有更好的方法来解决这个问题或更好的编程语言?
file2的$1和$2和$3从file1和$1和$2必须匹配file1的$1并且在file1的范围内987654348@ 的file1。
所以为了在输出中打印该行,它必须匹配 $1 并且在 $2 和 $3 的范围内 file2
因此,由于来自 file2 的行在 file1 和 $2 和 $3 范围内匹配 $1,因此它被打印在输出中。
谢谢你:)。
file1 (~3MB)
1 948953 948956 chr1:948953-948956 . ISG15
1 949363 949858 chr1:949363-949858 . ISG15
2 800000 900500 chr1:800000-900500 . AGRN
file2 (~80MB)
1 12214 . C G
1 949800 . T G
2 900000 rs123 - A
3 900000 . C -
想要的输出 tab-delimited
1 949800 . T G ISG15
2 900000 rs123 - A AGRN
awk
awk -F'\t' -v OFS='\t' '
NR == FNR {min[NR]=$2; max[NR]=$3; Gene[NR]=$NF; next}
{
for (id in min)
if (min[id] < $2 && $2 < max[id]) {
print $0, id, Gene[id]
break
}
}
' file1 file2
【问题讨论】:
-
我编辑了这篇文章,希望对您有所帮助。谢谢你:)。
-
是
2 900000 rs123 - A或2 900000 rs123 - A AGRN在所需的输出中吗? -
抱歉,这是正确的:
2 900000 rs123 - A AGRN。在帖子中也进行了更改。谢谢你:)。 -
如果您应该测试部分或全部这些解决方案,我有兴趣了解它们的执行时间吗?
-
我会测试它们并在有机会时报告执行时间(年底总是很忙)。但我肯定会测试所有这些出色的解决方案。谢谢你:)。
标签: awk