Предположим, что большой файл журнала состоит из нескольких ГБ и нескольких миллионов строк, где каждая строка содержит токен, идентифицирующий учетную запись пользователя, сгенерировавшую эту строку.
Все токены имеют одинаковую длину и могут быть найдены в позиции в каждой строке журнала.
Цель состоит в том, чтобы выяснить количество байтов, зарегистрированных каждой учетной записью.
Один из способов сделать это состоит из нескольких шагов, например:
awk -F "|" '{ print $5 }' trace.log | sort | uniq | xargs -l sh -c 'echo -n $0 && grep "$0" trace.log | wc -c'
где awk извлекает токен (5-я запись с помощью '|'), сортировка | uniq извлекает список уникальных токенов, появляющихся в файле, и, наконец, xargs greps и подсчитывает байты.
Теперь это работает, но это ужасно неэффективно, потому что один и тот же (огромный) файл получает grep X раз.
Есть ли более разумный способ добиться того же с помощью команд оболочки? (где под «умнее» я подразумеваю более быструю и не требующую тонны ОЗУ или временную память, например, сортировку всего файла в ОЗУ или сортировку в файл tmp).