繁体   English   中英

使用awk比较和打印两个文件的输出

[英]Using awk to compare and print output from both files

是否可以使用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]}'

但它不起作用

我的示例数据如下所示:

queryfile

chr1 1000 1005 BDSD
chr1 1010 1015 SKK1
chr2 1015 1015 AVPR

hitsfile

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时速度较慢!

谢谢!

注意:此答案对于该问题的早期版本是正确的。 请查看问题的修订历史以获取详细信息。


如果要在awk中设计这样的过程,则需要考虑的基本内容是比较两个文件,其中一个文件的重要部分需要加载到内存中。 如果您可以确保使用的内存量不需要使用swap,那么您将处于领先地位。 :)

所以...假设queryfile很小而hitsfile很大,那么您需要这样的东西:

$ awk '

  # First, store every line of our first file in an array.  Simply mentioning
  # an array element is sufficient, you don't need to assign anything.

  NR == FNR {
    a[$0];
    next;
  }

  # Second, walk through any remaining data (second file, third, etc),
  # comparing it to elements in the array we stored in the section above.
  # If the condition here is true, the default action is to print the line.

  $0 in a

' queryfile hitsfile

很明显,这可以缩短为单线。 您已经知道该怎么做。

最终结果是,如果第二个文件中的每一行都出现在第一个文件中,则将对其进行打印。 通过扩展,仅打印出现在两个文件中的行。

使用您在问题中提供的样本数据,我得到的输出看起来与查询文件相同,因为查询文件的每个项目在hitsfile中都出现一次。

如果这不是您想要的结果,请在您的问题中提供更详细的解释,以及您想要的示例输出。

替代解决方案

您可能根本不需要使用awk。

fgrep -xf queryfile hitsfile

fgrep命令等效于grep -F ,它比较固定字符串而不是正则表达式。 -x选项告诉grep仅考虑整行,有效地在结尾处锚定空值,例如regex ^...$ -f选项表示匹配的字符串列表应从指定的文件(在本例中为queryfile

最终结果是您有C代码运行搜索而不是awk脚本。 由于文件较大,因此我将让您进行基准测试,但是我会对了解性能差异感兴趣。

$ awk 'NR==FNR{a[$1,$2]=$4;next} ($1,$2) in a{print $0, a[$1,$2]}' queryfile hitsfile
chr1 1000 1005 0.5 BDSD
chr1 1010 1015 0.4 SKK1
chr2 1015 1015 0.1 AVPR

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM