来自一个文件的匹配模式awk不工作

来自一个文件的匹配模式awk不工作,awk,pattern-matching,Awk,Pattern Matching,我想匹配模式文件中的字符串以查看Source.txt文件 pattern_list.txt有139k行 Source.txt超过500万行 如果我像这样使用grep,需要2秒钟才能得到输出 grep -F -f pattern_list.txt Source.txt > Output.txt 但是如果我尝试使用这个AWK脚本,它会被卡住,10分钟后我需要停止,因为什么都没有发生 awk 'NR==FNR {a[$1]; next} { for (i in a) if ($0 ~ i)

我想匹配模式文件中的字符串以查看Source.txt文件

pattern_list.txt有139k行

Source.txt超过500万行

如果我像这样使用grep,需要2秒钟才能得到输出

grep -F -f pattern_list.txt Source.txt > Output.txt
但是如果我尝试使用这个AWK脚本,它会被卡住,10分钟后我需要停止,因为什么都没有发生

awk 'NR==FNR {a[$1]; next} {

for (i in a) if ($0 ~ i) print $0

 }' FS=, OFS=, pattern_list.txt Source.txt > Output.txt
模式列表是这样的

21051
99888
95746
和source.txt类似

72300,2,694
21051,1,694
63143,3,694
25223,2,694
99888,8,694
53919,2,694
51059,2,694
我的AWK脚本有什么问题


我正在Windows中的Cygwin上运行。

如果提高性能是您的目标,您需要多线程处理此AWK不太可能更快,也可能更慢

如果我是你,我会对源文件进行分区,然后搜索每个部分:

$ split -l 100000 src.txt src_part
$ ls src_part* | xargs -n1 -P4 fgrep -f pat.txt > matches.txt
$ rm src_part*

如果提高性能是您的目标,您将需要多线程处理此AWK不太可能更快,也可能更慢

如果我是你,我会对源文件进行分区,然后搜索每个部分:

$ split -l 100000 src.txt src_part
$ ls src_part* | xargs -n1 -P4 fgrep -f pat.txt > matches.txt
$ rm src_part*

如果您正在进行文字匹配,这应该比您的方法更快

$ awk -F, 'NR==FNR{a[$0]; next} $1 in a{print $1,$3,$8,$20}' pattern_list source > output

然而,我认为sort/join仍然会比grep和awk更快。

如果您正在进行文本匹配,那么这应该比您的方法更快

$ awk -F, 'NR==FNR{a[$0]; next} $1 in a{print $1,$3,$8,$20}' pattern_list source > output

不过,我认为sort/join仍然比grep和awk快。

谢谢你的回答,但我知道awk比grep快。所以,我不知道这里发生了什么。@GerCas我怀疑这是真的,因为AWK必须解析脚本,然后运行。另一方面,grep针对其目的进行了大量优化。谢谢您的回答,但我知道awk比grep更快。所以,我不知道这里发生了什么。@GerCas我怀疑这是真的,因为AWK必须解析脚本,然后运行。另一方面,grep针对它的用途进行了大量优化。另一种方法:join-t,可能是@codeforester的副本。嗨,我问了更多关于为什么我的awk脚本这么慢的问题,而不是用perl问最快的方法grep,bash或其他工具。由于您的awk代码正试图准确说明链接帖子中接受的答案在做什么,我认为它是重复的,或者至少是相关的。另一种方法是:join-t,可能是@codeforester Hi的重复,我问的更多是为什么我的awk脚本如此缓慢,而不是用perl问最快的方法grep,因为你的awk代码正试图精确地解释链接帖子中被接受的答案在做什么,我认为它是重复的,或者至少是相关的。非常好。现在,awk脚本的执行时间少于4秒。但是,由于我的原始源文件中有几个字段,如何在脚本中对匹配的字符串仅打印$3、$8和$20?无法改进karakfa的答案,但对于grep vs awk性能测试,请参阅@karakfa,非常感谢。它完全符合我的要求。@user2138595谢谢你分享信息。是的,这就是我在理论和实践中所理解的,awk是速度冠军。太棒了。现在,awk脚本的执行时间少于4秒。但是,由于我的原始源文件中有几个字段,如何在脚本中对匹配的字符串仅打印$3、$8和$20?无法改进karakfa的答案,但对于grep vs awk性能测试,请参阅@karakfa,非常感谢。它完全符合我的要求。@user2138595谢谢你分享信息。是的,这就是我在理论和实践中所理解的,awk是速度冠军。