поиск по нескольким файлам слишком медленный с использованием grep - PullRequest
0 голосов
/ 03 апреля 2019

Я пытаюсь найти 607526 целочисленных записей (сохраненных в массиве) в нескольких файлах, добавляя одинаковые значения и сохраняя в файлах. Это заняло 1 час 45 минут для 32470 записей, но еще не завершено.Не могли бы вы помочь мне улучшить этот сценарий.Сценарий выглядит следующим образом:

#!/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

Inptu и Outputs:

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 при желании.

1 Ответ

1 голос
/ 03 апреля 2019

Это сработало в моей эмуляции 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_*

Логика: сделать один проход через все файлы данных, чтобы суммировать значения для каждого ключа. Затем один проход через главный файл, чтобы получить полный набор ключей, печатая сумму для каждого. Это вызывает только один первичный процесс для одного чтения каждого файла, а не два для начальной загрузки, а затем два для полного сканирования всех файлов данных для каждого ключа, что составляет сотни тысяч проходов через файлы.

Вопросы приветствуются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...