【发布时间】:2015-04-28 00:01:48
【问题描述】:
是否可以使用 awk 比较两个匹配的文件并返回结果?
我目前正在使用:
awk 'BEGIN{FS=OFS="\t"} NR==FNR{c[$1$2]++;next};c{$1$2}>0' queryfile hitsfile
匹配查询结果并返回匹配中的输出,但是它只返回匹配文件中的列
我试过了:
awk 'BEGIN{FS=OFS="\t"} NR==FNR{c[$1$2]++;next};c{$1$2}>0 {print $1,$2,c[$1]}'
但它不起作用
我的示例数据如下所示:
查询文件
chr1 1000 1005 BDSD
chr1 1010 1015 SKK1
chr2 1015 1015 AVPR
点击文件
chr1 1000 1005 0.5
chr1 1001 1002 0.35
chr1 1010 1015 0.4
chr1 1011 1016 0.56
chr2 1015 1015 0.1
我希望我的输出文件如下所示
*output results*
chr1 1000 1005 0.5 BDSD
chr1 1010 1015 0.4 SKK1
chr2 1015 1015 0.1 AVPR
因此,基本上,与查询匹配的命中加上查询数据中的另一列。这可以使用 awk oneliners 吗?
另外,另一个问题是是否有可能在查询文件中给定一个查询范围,并返回与 awk 完全匹配比较的 hitsfile 中的所有行?
通常我在 R 中执行这些操作,但是在处理大文件时速度很慢,而 awk 则要快得多!
谢谢!
【问题讨论】:
-
这些文件有多大?您运行分析的系统的规格是什么?
-
查询文件通常没有那么大,最多几千行。但是,命中文件的范围可以从 40 万行到几百万行不等。我试过用 R 和 awk 在 64 GB 内存的 8 核服务器上运行,与使用 which %in% 和 R 相比,awk 的速度要快得多
-
永远不要使用
c[$1$2],而是使用c[$1,$2]。想象一下输入1 23和12 3的区别。你为什么关心解决方案是否是一条线?为什么你知道数组语法在脚本的一个位置是c[],但认为它在另一个位置是c{}?