【发布时间】:2020-10-12 09:01:55
【问题描述】:
我有一个带有名称的文件,我想在一个巨大的制表符分隔文件中搜索它们并获取相应的行。我需要匹配确切的名称。所以我尝试了这个 grep 选项,我使用名称文件 (-f) 搜索一个大文件,并指定我想要 完全匹配 (-w)。
grep -f names -w bigfile > outputfile
由于制表符分隔文件很大,grep 命令耗时太长,所以我正在寻找一个 awk 替代方案。到目前为止,我尝试过:
awk 'NR==FNR{a[$0]=$0}NR>FNR{if($2==a[$2])print $0}' names bigfile > outputfile
在这里,我在大文件的第 2 列中查找匹配项并打印相应的行。
问题是这个 awk 选项不是特定的。有没有人建议如何修改这个单行符,使其与正则表达式完全匹配?
编辑
这是一个例子:
假设名称文件如下所示:
GN2a__NODE_1000349_length_1013_cov_0.309117_1
GN4a__NODE_1000349_length_1013_cov_0.303417_1
GN3a__NODE_1000343_length_1013_cov_0.309417_2
GN2a__NODE_1020349_length_1013_cov_0.109437_1
GN2a__NODE_1020349_length_1013_cov_0.109437_10
GO4a__NODE_9_length_201043_cov_2.340371_8
GO4a__NODE_9_length_201043_cov_2.340371_83
制表符分隔的大于 800 万行的大文件的前 9 行如下所示:
7001253F:563:CC1HJANXX:8:2210:1232:2187#CTGAAGCTCAGGACGT GN2a__NODE_1000349_length_1013_cov_0.309117_1
7001253F:563:CC1HJANXX:8:2210:1968:2031#CTGAAGCTCAGGACGT GN4a__NODE_1000349_length_1013_cov_0.303417_1
7001253F:563:CC1HJANXX:8:2210:1968:2031#CTGAAGCTCAGGACGT GN3a__NODE_1000343_length_1013_cov_0.309417_2
7001253F:563:CC1HJANXX:8:2210:1968:2031#CTGAAGCTCAGGACGT GN2a__NODE_1020349_length_1013_cov_0.109437_1
7001253F:563:CC1HJANXX:8:2210:1968:2031#CTGAAGCTCAGGACGT GN2a__NODE_1020349_length_1013_cov_0.109437_10
7001253F:563:CC1HJANXX:8:2210:1968:2031#CTGAAGCTCAGGACGT GN2a__NODE_1020349_length_1013_cov_0.109437_14
7001253F:563:CC1HJANXX:8:2210:1968:2031#CTGAAGCTCAGGACGT GO4a__NODE_9_length_201043_cov_2.340371_8
7001253F:563:CC1HJANXX:8:2210:1968:2031#CTGAAGCTCAGGACGT GO4a__NODE_9_length_201043_cov_2.340371_83
7001253F:563:CC1HJANXX:8:2210:1968:2031#CTGAAGCTCAGGACGT GO4a__NODE_9_length_201043_cov_2.340371_87
我希望我的输出如下所示:
7001253F:563:CC1HJANXX:8:2210:1232:2187#CTGAAGCTCAGGACGT GN2a__NODE_1000349_length_1013_cov_0.309117_1
7001253F:563:CC1HJANXX:8:2210:1968:2031#CTGAAGCTCAGGACGT GN4a__NODE_1000349_length_1013_cov_0.303417_1
7001253F:563:CC1HJANXX:8:2210:1968:2031#CTGAAGCTCAGGACGT GN3a__NODE_1000343_length_1013_cov_0.309417_2
7001253F:563:CC1HJANXX:8:2210:1968:2031#CTGAAGCTCAGGACGT GN2a__NODE_1020349_length_1013_cov_0.109437_1
7001253F:563:CC1HJANXX:8:2210:1968:2031#CTGAAGCTCAGGACGT GN2a__NODE_1020349_length_1013_cov_0.109437_10
7001253F:563:CC1HJANXX:8:2210:1968:2031#CTGAAGCTCAGGACGT GO4a__NODE_9_length_201043_cov_2.340371_8
7001253F:563:CC1HJANXX:8:2210:1968:2031#CTGAAGCTCAGGACGT GO4a__NODE_9_length_201043_cov_2.340371_83
而使用 awk 单行,我得到:
7001253F:563:CC1HJANXX:8:2210:1232:2187#CTGAAGCTCAGGACGT GN2a__NODE_1000349_length_1013_cov_0.309117_1
7001253F:563:CC1HJANXX:8:2210:1968:2031#CTGAAGCTCAGGACGT GN4a__NODE_1000349_length_1013_cov_0.303417_1
7001253F:563:CC1HJANXX:8:2210:1968:2031#CTGAAGCTCAGGACGT GN3a__NODE_1000343_length_1013_cov_0.309417_2
7001253F:563:CC1HJANXX:8:2210:1968:2031#CTGAAGCTCAGGACGT GN2a__NODE_1020349_length_1013_cov_0.109437_1
7001253F:563:CC1HJANXX:8:2210:1968:2031#CTGAAGCTCAGGACGT GN2a__NODE_1020349_length_1013_cov_0.109437_10
7001253F:563:CC1HJANXX:8:2210:1968:2031#CTGAAGCTCAGGACGT GO4a__NODE_9_length_201043_cov_2.340371_8
7001253F:563:CC1HJANXX:8:2210:1968:2031#CTGAAGCTCAGGACGT GO4a__NODE_9_length_201043_cov_2.340371_83
7001253F:563:CC1HJANXX:8:2210:1968:2031#CTGAAGCTCAGGACGT GO4a__NODE_9_length_201043_cov_2.340371_87
【问题讨论】:
-
欢迎来到 SO,感谢您以代码的形式展示您的努力,继续努力。您能否在您的问题中也发布输入和预期输出的小/合理样本数据集,以便我们对此有更多了解,请编辑您的问题并让我们知道。
-
另外,通过看到您的尝试看起来您正在处理 2 个 Input_file(s),因此请在您的问题中发布它们两个样本的小 sn-p 样本以及预期的样本输出。跨度>
标签: regex awk grep pattern-matching