2015-12-23 62 views
1

我有巨大的文件数量,大约200,000记录在一个文件中。我一直在测试一些情况,在这些情况下,我必须弄清楚文件的命名模式是否与某些特定的字符串匹配。这里是我如何前面 -嵌套for循环太慢:1MN记录遍历

测试字符串,我存储在一个文件(假设一个案件,他们是10)。包含字符串记录的实际文件,以换行符分隔;总计高达20万条记录。要检查大文件中是否存在测试字符串模式,我写了一个小的嵌套for循环。

for i in `cat TestString.txt` 
do 
for j in `cat LargeFile.txt` 
do 
if [[ $i == $j ]] 
then 
echo "Match" >> result.txt 
fi 
done 
done 

此嵌套循环的实际需要做的遍历(如果我没看错的概念),10x200000倍。通常情况下,我没有看到服务器上的负载太大,但所花费的时间就像从前一样。节录在过去4小时内运行,并且有一些“匹配”结果。

有没有人有任何想法来加速?我用python或perl touch找到了很多答案,但我老实说在Unix上搜索某些东西。

感谢

+0

您当前的代码读取每个循环一个字。当TestString.txt中的10个记录每个都有20个字时,您将循环执行LargeFile.txt 10x20x200.000次。你多久检查一次?当LargeFile.txt对每条记录也有20个字时,您可以进行10x20x200.000x20的比较。 –

+1

您应该将'>> result.txt'移到循环外部,这样您将不会关闭并打开每个循环的文件。 –

回答

3

尝试以下操作:

grep -f TestString.txt LargeFile.txt >> result.txt 
+0

我总是忽略grep的力量。完美解决方案谢谢沃尔特。 – knowone

+0

@knowone:当你满意这个答案时,你可以接受它。 –

+0

完成。道歉,我本来应该做的。 – knowone

1

退房grep

while read line 
do 
    cat LargeFile.txt | grep "$line" >> result.txt 
done < TestString.txt 

grep的将输出任何匹配的字符串。这可能会更快。请注意,您的TestString.txt文件不应该有任何空行或grep将从LargeFile.txt返回所有内容。

+0

grep是我没有认真对待:) 这种方法也很好。谢谢羚羊。 – knowone