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