
Как узнать количество слов в файле?
Мне нужна гистограмма каждого слова в текстовом конвейере или документе. Новая строка и пустые строки будут существовать в документе. Я удалил все, кроме [a-zA-Z]
.
> cat doc.txt
word second third
word really
> cat doc.txt | ... # then count occurrences of each word \
# and print in descending order separated by delimiter
word 2
really 1
second 1
third 1
Он должен быть достаточно эффективным, поскольку файл представляет собой текст размером 1 ГБ и не может работать с экспоненциальной загрузкой.
решение1
Попробуй это:
grep -o '\w*' doc.txt | sort | uniq -c | sort -nr
-o
Печатать каждое совпадение вместо соответствующих строк\w*
Сопоставьте символы словаsort
сортируем совпадения перед отправкой по конвейеруuniq
.uniq -c
вывести уникальные строки и количество вхождений-c
sort -nr
Обратная сортировка по количеству вхождений.
Выход:
2 word
1 third
1 second
1 really
Альтернатива:
awk
Для точного вывода используйте :
$ grep -o '\w*' doc.txt \
| awk '{seen[$0]++} END{for(s in seen){print s,seen[s]}}' \
| sort -k2r
word 2
really 1
second 1
third 1
решение2
perl -lnE '
$count{$_}++ for /[[:alpha:]]+/g;
END {
say "@$_" for
sort {$b->[1] <=> $a->[1] || $a->[0] cmp $b->[0]}
map {[$_, $count{$_}]}
keys %count
}
' doc.txt
Это потребует гораздо больше памяти, чем первоначальное решение pLumo.