Поиск уникальной замены -c для больших файлов

У меня есть большой файл (50 ГБ), и я хотел бы подсчитать количество вхождений в нем разных строк. Обычно я бы использовал

sort bigfile | uniq -c

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

grep -cfx 'one possible line'

для каждой уникальной строки в файле, но это будет означать n проходов по файлу для каждой возможной строки, что (хотя и гораздо более удобно для памяти) занимает даже больше времени, чем оригинал.

Любые идеи?


связанный вопрос спрашивает о способе найти уникальные строки в большом файле, но я Я ищу способ подсчитать количество экземпляров каждой из них -- я уже знаю возможные строки.


person Charles    schedule 02.09.2015    source источник
comment
Возможно, это вырожденный случай stackoverflow.com/questions/3502177/; ответ stackoverflow.com/a/22250460/14122 в значительной степени соответствует тому, что у нас уже есть, только выбор столбца чем использовать всю линию.   -  person Charles Duffy    schedule 03.09.2015


Ответы (3)


Используйте 1_

awk '{c[$0]++} END {for (line in c) print c[line], line}' bigfile.txt

Это O(n) во времени и O(уникальных строк) в пространстве.

person Barmar    schedule 02.09.2015
comment
Возможно, это заполняет порт этой логикой для awk-запроса в моей версии bash. :) - person Charles Duffy; 03.09.2015
comment
bigfile.txt может быть аргументом команды awk, перенаправление ввода не требуется. - person Reza Hashemi; 19.07.2017

Вот решение с использованием jq 1.5. По сути, это то же самое, что и решение awk, как по подходу, так и по характеристикам производительности, но результатом является объект JSON, представляющий хэш. (Программу можно тривиально изменить для получения вывода в альтернативном формате.)

Вызов:

$ jq -nR 'reduce inputs as $line ({}; .[$line] += 1)' bigfile.txt

Если бы bigfile.txt состоял из этих строк:

a
a
b
a
c

тогда вывод будет:

{
  "a": 3,
  "b": 1,
  "c": 1
}
person peak    schedule 03.09.2015

person    schedule
comment
Чем поможет grep, он будет соответствовать всем строкам? - person Barmar; 03.09.2015
comment
@Barmar, он соответствует только строкам в известном наборе. Когда я читаю вопрос, они перемежаются другими строками, которые не волнуют ОП. - person Charles Duffy; 03.09.2015