我想匹配模式文件中的字符串以查看Source.txt文件。
pattern_list.txt有13.9万行
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
pattern_list就是这样
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上运行。
答案 0 :(得分:2)
如果要提高性能是您的目标,则需要对此进行多线程处理(AWK不太可能更快,也许更慢?)。
如果我是您,则将源文件分区,然后搜索每个部分:
$ split -l 100000 src.txt src_part
$ ls src_part* | xargs -n1 -P4 fgrep -f pat.txt > matches.txt
$ rm src_part*
答案 1 :(得分:2)
如果您要进行文字匹配,这应该比您的方法要快
$ awk -F, 'NR==FNR{a[$0]; next} $1 in a{print $1,$3,$8,$20}' pattern_list source > output
但是,我认为sort/join
仍然比grep和awk快。