【问题标题】:searching on multiple files is too slow using grep使用 grep 搜索多个文件太慢
【发布时间】:2019-08-25 00:12:38
【问题描述】:

我正在尝试在多个文件中搜索 607526 个整数条目(保存在数组中)并添加相同的值并存储在文件中。32470 个条目花了 1 小时 45 分钟,但尚未完成。你能帮我改进这个脚本吗? 脚本如下:

#!/bin/bash

my_array=( `grep Curr a.txt  | sed -e 's/Time:\(.*\).Num.*/\1/'` )
my_array_length=${#my_array[@]}
echo $my_array_length

rm -rf output
touch output

for element in "${my_array[@]}"
do
#   echo "${element}"
   toggles=`grep -w "time: ${element}" file_* | awk '{ sum += $6}; END {print sum }'`
   echo "Time:"${element}".Num - "$toggles >> output
done

输入和输出是:

a.txt

Curr Time:0.Num - 6274
Curr Time:500.Num - 2
Curr Time:1500.Num - 62
Curr Time:2000.Num - 3
Curr Time:2500.Num - 2
Curr Time:3000.Num - 214
Curr Time:3500.Num - 205
Curr Time:4500.Num - 2
Curr Time:5000.Num - 211
Curr Time:5500.Num - 231


file_0

time: 0 count: 517
time: 2000 count: 9
time: 2500 count: 30
time: 4500 count: 14
time: 5000 count: 2


file_1

time: 0 count: 1500
time: 500 count: 10
time: 1500 count: 25
time: 2500 count: 39
time: 4500 count: 26
time: 5500 count: 154

output

Curr Time:0.NumToggles - 2017
Curr Time:500.NumToggles - 11
Curr Time:1500.NumToggles - 25
Curr Time:2000.NumToggles - 9
Curr Time:2500.NumToggles - 69
Curr Time:3000.NumToggles - 0
Curr Time:3500.NumToggles - 0
Curr Time:4500.NumToggles - 40
Curr Time:5000.NumToggles - 2
Curr Time:5500.NumToggles - 154

如果需要,可以在https://i.stack.imgur.com/kFxt8.jpg 获取图片。

【问题讨论】:

  • 首先,您似乎产生了很多冗余进程。我认为我们可以调整很多。其次,请提供输入文件的示例,并提供有关您要完成的工作的更多详细信息。第三 - 快速提示 - 在awk 中重写整个想法并一次性完成。 (或 perl。或 bash - read 很慢,但仍可能比这种方式更快。)
  • Don't use images. 人们希望复制/粘贴或下载您的数据,以便我们可以在提供解决方案之前使用相同的文件进行测试。没有人愿意输入所有这些,即使它只是一个 fe 行,lol

标签: bash shell scripting grep


【解决方案1】:

这适用于我的 git bash 仿真。如果它在完整的数据集上阻塞,请告诉我。

awk -v keyfile=a.txt ' { sum[$2] += $4; next; }
 END { 
   while ( getline < keyfile && "$0" ) {
     match( $0, "^Curr Time:(.*).Num", key);
     printf "Curr Time:%d.NumToggles - %d\n", key[1], sum[key[1]];
   }
 }
' file_*

逻辑:通过所有数据文件对每个键的值求和。然后通过主文件获取全套密钥,打印每个密钥的总和。这仅调用一个主进程来读取每个文件,而不是两个用于初始加载,然后两个用于完整扫描所有数据文件的每个键,这是数十万次通过文件。

欢迎提问。

【讨论】:

  • 不客气!它在真实数据上的表现如何?
  • 仅约 1 分钟
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-30
  • 1970-01-01
  • 2017-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多