Сортуйте кількість зустрічей у текстовому файлі для всіх слів і вихід друку


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

Отже, це не пошук за рядком, а слово за словом, і це робить для всіх слів, а не лише для 1 слова. Я давно знайшов його в інтернетах, але не можу його знайти або запам'ятати.

Відповіді:


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 сортує в числовому зворотному порядку при ігноруванні пробілів

Ого. це виявилося чудовою командою рахувати лайку за рядки

знайти. -ім'я "* .py" -exec cat {} \; | tr '[: space:]' '[\ n *]' | grep -v "^ \ s * $" | сортувати | uniq -c | сортувати -bnr | греп ебать


Можна використовувати tr -sдля обробки декількох пробілів, особливо коли стикаються з відступом.
Арседж

@Arcege: Добре. Хоча це не змінить результат, він може трохи пришвидшити сценарій.
продавець

-g( --general-numeric-sort) варіант sortможе бути кращим у деяких випадках. Напр. sort -nТриматиметься 10\n1 4як є, трактуючи 1 4як 14, тоді як sort -gбуде поводитись як правильно 1 4\n10.
Skippy le Grand Gourou

приємна команда, дійсно заслуговують на голосування :)
Noor

@seler Я думаю, що ви можете зробити grep і tr деталі ще простішими, як показано нижче: echo "Lorem ipsum dolor sit sit amet et cetera." | tr ' ' '\n' | grep -v "^$" | sort | uniq -c | sort -bnrЗауважте, що я початківець, тому я можу помилятися, будь ласка, не соромтеся порадити.
smc

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 and 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:)



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 К на машині у віках, класичному жорсткому диску (IDE).

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.