最快的方法是在Linux中的文件中列出另外数百万条记录中的1000条记录

时间:2016-05-26 04:15:35

标签: python linux bash shell awk

在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 

有人能建议更好的方法吗?

3 个答案:

答案 0 :(得分:0)

如果你有tac和grep(GNU),你可以使用

tac /test/done/TEST_RT* | grep -m 1 $i

在for循环中。这比查找所有匹配并仅选择最后一个匹配要快得多。

答案 1 :(得分:0)

显然,性能问题来自这样一个事实:对于较大文件中的每一行,您会一次又一次地查看所有数据。也许你应该采取不同的方法。在不知道问题的具体领域的情况下,我猜错了:

  1. 首先以某种方式对/test/done/TEST_RT*中的数据进行排序,以允许O(1)访问 - 例如,根据$1的值将其分解为散列目录结构中的多个文件
  2. 然后传递/home/admin/pnd_tmp中的行,访问每行的右侧文件中的数据并使用awk进行操作。
  3. 基本上,您执行双程过程,首先对数据进行排序,并在需要时更快地访问它。

答案 2 :(得分:0)

如果我没有误解你的问题,

grep -f PATTERNFILE HUGEFILE | tail -n 1

将在HUGEFILE中找到最后一行,其中包含PATTERNFILE中的任何模式。

如果您正在寻找PATTERNFILE中每个模式的最后一次出现,我不会因为性能原因而使用shell脚本(虽然很容易),但是用于实例Ruby或Perl。如果您要使用此解决方案并需要帮助,请在发布中澄清。