Метод сортировки и подсчета быстрее, чем файл cat | сортировать | uniq -c - PullRequest
0 голосов
/ 08 марта 2012

У меня есть следующий скрипт, который анализирует некоторые |пары полей / значений с разделителями.Пример данных выглядит следующим образом: | Apple = 32.23 | Banana = 1232.12 | Grape = 12312 | Pear = 231 | Grape = 1231 |

Я просто хочу подсчитать, сколько раз имена полей A, B или C появляются вжурнальный файл.Список полей должен быть динамическим.Файлы журнала имеют «большой» размер около 500 мегабайт каждый, поэтому для сортировки каждого файла требуется некоторое время.Есть ли более быстрый способ подсчета, как только я выполню вырезку и получу файл с одним полем на строку?

 cat /bb/logs/$dir/$file.txt | tr -s "|" "\n" | cut -d "=" -f 1 | sort | uniq -c > /data/logs/$dir/$file.txt.count

Я точно знаю, что эта часть выполняется быстро.Я могу с уверенностью увидеть, что это увязло в этом роде.

cat /bb/logs/$dir/$file.txt | tr -s "|" "\n" | cut -d "=" -f 1 

После того, как я выполнил вырезку, образец вывода ниже, конечно, файл намного длиннее

Apple
Banana
Grape
Pear
Grape

После сортировки и подсчета я получаю

 1 Apple
 1 Banana 
 1 Pear
 2 Grape

Проблема в том, что мои реальные данные занимают слишком много времени.Я думаю, что это было бы быстрее> вывод вырезки в файл, но не уверен, что самый быстрый способ подсчета уникальных записей в «большом» текстовом файле

1 Ответ

3 голосов
/ 08 марта 2012

AWK может сделать это довольно хорошо без сортировки, попробуйте это, оно должно работать лучше;

cat test.txt | tr -s "|" "\n" | cut -d "=" -f 1 |
   awk '{count[$1]++}END{for(c in count) print c,"found "count[c]" times."}' 
...