Получить количество появлений в текстовом файле всех слов и распечатать отсортированный вывод

28

У меня была команда, которая работала бы с текстовым файлом, подсчитывала все вхождения слов и распечатывала их так:

user@box $˜ magic-command-i-forgot | with grep | and awk | sort ./textfile.txt
66: the
54: and
32: I
16: unix
12: bash
5:  internet
3:  sh
1: GNU/Linux

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

Кусалананда
источник

Ответы:

33

Я бы использовал trвместо awk :

echo "Lorem ipsum dolor sit sit amet et cetera." | tr '[:space:]' '[\n*]' | grep -v "^\s*$" | sort | uniq -c | sort -bnr
  • tr просто заменяет пробелы на новые строки
  • grep -v "^\s*$" обрезает пустые строки
  • sort подготовить как вход для uniq
  • uniq -c считать вхождения
  • sort -bnr сортирует в числовом обратном порядке, игнорируя пробелы

Вау. это оказалось отличной командой для подсчета ругательств

находить . -name "* .py" -exec cat {} \; | tr '[: space:]' '[\ n *]' | grep -v "^ \ s * $" | сортировать | uniq -c | сортировать -bnr | ебать

Селер
источник
Возможно, потребуется использовать tr -sдля обработки нескольких пробелов, особенно при возникновении отступов.
Arcege
@ Arcege: Хороший вопрос. Хотя это не изменит результат, он может немного закрепить скрипт.
продавец
-g( --general-numeric-sort) опция sortможет быть предпочтительнее в некоторых случаях. Например, sort -nбудет сохранять, 10\n1 4как есть, лечить 1 4как 14, пока sort -gбудет правильно относиться к нему как 1 4\n10.
Скиппи ле Гран Гуру
хорошая команда, действительно заслуживает голосования :)
Noor
@seler Я думаю, вы можете сделать части grep и tr еще проще, как показано ниже: echo "Lorem ipsum dolor sit sit amet et cetera." | tr ' ' '\n' | grep -v "^$" | sort | uniq -c | sort -bnrОбратите внимание, что я новичок, поэтому я могу ошибаться, пожалуйста, не стесняйтесь советовать.
СМЦ
8
  1. Разделите ввод на слова, по одному в строке.
  2. Сортировать полученный список слов (строк).
  3. Сквош несколько раз.
  4. Сортировать по количеству появлений.

Чтобы разбить ввод на слова, замените любой символ, который вы считаете разделителем слов, новой строкой.

<input_file \
tr -sc '[:alpha:]' '[\n*]' | # Add digits, -, ', ... if you consider
                             # them word constituents
sort |
uniq -c |
sort -nr
Жиль "ТАК - перестань быть злым"
источник
Это хороший ответ, потому что он может справиться со случаем, когда слова находятся непосредственно рядом с какой-то несловной пунктуацией, которую вы хотите игнорировать.
Дэвид Грейсон,
5

Не используя grep и awk, но, похоже, это делает то, что вы хотите:

for w in `cat maxwell.txt`; do echo $w; done|sort|uniq -c
  2 a
  1 A
  1 an
  1 command
  1 considered
  1 domain-specific
  1 for
  1 interpreter,
  2 is
  1 language.
  1 line
  1 of
Брэм
источник
1
Это не сработает, если входные данные содержат подстановочные знаки оболочки (вам нужно добавить set -f) и обрабатывают пунктуацию как часть слов (что может быть неловко исправлено путем добавления символов пунктуации в IFS- удачи в попытках поддержать наборы символов не-ASCII). Это не будет хорошо с очень большими входными файлами, поскольку он хранит весь файл в памяти ( sortумнее).
Жиль "ТАК - перестань быть злым"
2

Я полагаю, вы после чего-то вроде этого?

$ perl -n -e 'foreach ${k} (split(/\s+/)){++$h{$k}};END{foreach $l (keys(%h)){print "$h{$l}: ${l}\n"}}' /path/to/your/file | sort -n -k 1

конечно, вы можете сделать то же самое с awk:)

amitkr
источник
2

Используя awk/sort/uniqрешение:

awk '{for(w=1;w<=NF;w++) print $w}' ~/textFile.txt | sort | uniq -c | sort -nr
Принц Джон Уэсли
источник
Прекрасный! Это сработало без нареканий.
Stidmatt
0
file=/home/stefan/ooxml1.txt
for word in $(sed 's/[^A-Za-z]/ /g' $file | tr " " "\n" | sort -u)
do
  echo -n "$word "
  grep -c $word $file
done | sort -k2 -n 

сортирует по возрастанию после разбиения файла на слова.

Простой Grep найдет fishв fisheye, так что вы должны усилить команду Grep , чтобы предотвратить частичные совпадения.

Требуется около 3 с для текстового файла 25 КБ на компьютере в возрасте, классический HDD (IDE).

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

неизвестный пользователь
источник