在Linux中的文件中,另外百万条记录中的1000条记录列表的最快方法是什么?
让我们说这些是我的样本记录:
1,,EE1,1000,WAT,EEE,20160222T02:00:15+0400,20181231T23:59:59+0400,,vEEE,,47126469f184fee9a80664d952d7fea7,50278774602,95223904,140495221530736,21001,,,,,,,,,,,,,,,C
0,,EE1,1000,WAT,EEE,20160222T02:00:15+0400,20181231T23:59:59+0400,20160222T02:00:15+0400,,vEEE,47126469f184fee9a80664d952d7fea7,50278774602,,,21001,,,,,,,,,,,,,,,H
1,,EE1,1000,WAT,EEE,20160222T02:00:15+0400,20181231T23:59:59+0400,20160521T11:07:25+0400,,vEEE,47126469f184fee9a80664d952d7fea7,50278774602,0095223904,140495221530736,21001,,,,,,,,,,,,,,,H
如果我grep 50278774602
,值将分为三行。我已经使用for循环开发了一个脚本。我在一个文件中有一个这样的数字列表,我正在搜索大文件中的值(数百万行),我只需要最后一次出现包含我的grep模式的行。它与for
循环完美配合,但我担心的是它需要花费大量时间。
我的剧本:
for i in `cat /home/admin/pnd_tmp`; do
grep $i /test/done/TEST_RT* | tail -1 > /home/admin/pnd_fin |
awk -F "," '{if ( $1 == "4" ) print $13 }' > /home/admin/pnd_tmp_fin
done
有人能建议更好的方法吗?
答案 0 :(得分:0)
如果你有tac和grep(GNU),你可以使用
tac /test/done/TEST_RT* | grep -m 1 $i
在for循环中。这比查找所有匹配并仅选择最后一个匹配要快得多。
答案 1 :(得分:0)
显然,性能问题来自这样一个事实:对于较大文件中的每一行,您会一次又一次地查看所有数据。也许你应该采取不同的方法。在不知道问题的具体领域的情况下,我猜错了:
/test/done/TEST_RT*
中的数据进行排序,以允许O(1)访问 - 例如,根据$1
的值将其分解为散列目录结构中的多个文件/home/admin/pnd_tmp
中的行,访问每行的右侧文件中的数据并使用awk
进行操作。 基本上,您执行双程过程,首先对数据进行排序,并在需要时更快地访问它。
答案 2 :(得分:0)
如果我没有误解你的问题,
grep -f PATTERNFILE HUGEFILE | tail -n 1
将在HUGEFILE中找到最后一行,其中包含PATTERNFILE中的任何模式。
如果您正在寻找PATTERNFILE中每个模式的最后一次出现,我不会因为性能原因而使用shell脚本(虽然很容易),但是用于实例Ruby或Perl。如果您要使用此解决方案并需要帮助,请在发布中澄清。