Awk: Частота слов из одного текстового файла, как вывести в myFile.txt?

Даны файлы.txt с разделенными пробелами словами, такими как:

But where is Esope the holly Bastard
But where is

И функция Awk:

cat /pathway/to/your/file.txt | tr ' ' '\n' | sort | uniq -c | awk '{print $2"@"$1}'

Я получаю следующий вывод в моей консоли:

1 Bastard
1 Esope
1 holly
1 the
2 But
2 is
2 where

Как попасть в напечатанное в myFile.txt? У меня на самом деле 300 000 строк и около 2 миллионов слов. Лучше вывести результат в файл.


РЕДАКТИРОВАТЬ: Используется ответ (@Sudo_O):

$ awk '{a[$1]++}END{for(k in a)print a[k],k}' RS=" |\n" myfile.txt | sort > myfileout.txt

3 ответа

Решение

Ваш конвейер не очень эффективен, вы должны сделать все это в awk вместо:

awk '{a[$1]++}END{for(k in a)print a[k],k}' RS=" |\n" file > myfile

Если вы хотите вывод в отсортированном порядке:

awk '{a[$1]++}END{for(k in a)print a[k],k}' RS=" |\n" file | sort > myfile

Фактический результат, полученный вашим конвейером:

$ tr ' ' '\n' < file | sort | uniq -c | awk '{print $2"@"$1}'
Bastard@1
But@2
Esope@1
holly@1
is@2
the@1
where@2

Примечание: использование cat здесь бесполезно, мы можем просто перенаправить ввод с <, awk Сценарий также не имеет смысла, он просто меняет порядок частоты слов и слов и разделяет их @, Если мы уроним awk Скрипт выводит ближе к желаемому выводу (однако обратите внимание на предыдущий интервал, и он не отсортирован):

$ tr ' ' '\n' < file | sort | uniq -c 
      1 Bastard
      2 But
      1 Esope
      1 holly
      2 is
      1 the
      2 where

Мы могли бы sort снова удалить ведущие пробелы с sed:

$ tr ' ' '\n' < file | sort | uniq -c | sort | sed 's/^\s*//'
1 Bastard
1 Esope
1 holly
1 the
2 But
2 is
2 where

Но, как я уже говорил в начале пусть awk справиться:

$ awk '{a[$1]++}END{for(k in a)print a[k],k}' RS=" |\n" file | sort
1 Bastard
1 Esope
1 holly
1 the
2 But
2 is
2 where

Просто перенаправьте вывод в файл.

cat /pathway/to/your/file.txt % tr ' ' '\n' | sort | uniq -c | \
awk '{print $2"@"$1}' > myFile.txt

Просто используйте перенаправление оболочки:

 echo "test" > overwrite-file.txt
 echo "test" >> append-to-file.txt

подсказки

Полезная команда tee которые позволяют перенаправить в файл и по-прежнему видеть вывод:

echo "test" | tee overwrite-file.txt
echo "test" | tee -a append-file.txt

Сортировка и локаль

Я вижу, что вы работаете с азиатским сценарием, вам нужно быть осторожным с использованием языкового стандарта вашей системой, поскольку итоговая сортировка может не соответствовать вашим ожиданиям:

* ПРЕДУПРЕЖДЕНИЕ * Локаль, указанная средой, влияет на порядок сортировки. Установите LC_ALL=C, чтобы получить традиционный порядок сортировки, который использует собственные значения байтов.

И посмотрите на вывод:

locale 
Другие вопросы по тегам