来自一个文件的匹配模式无法正常运行

时间:2018-11-10 20:44:34

标签: awk pattern-matching

我想匹配模式文件中的字符串以查看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上运行。

2 个答案:

答案 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快。