Нет реальной необходимости предварительно обрабатывать текст, заменяя пробелы на новые строки и т. д., особенно если вы хотите объединить операции в один awk
скрипт.
$ awk '{ for (i=1; i<=NF; ++i) count[$i]++ } END { for (word in count) print count[word], word }' file
4 the
2 sunny
3 is
1 day
Это обходит каждое слово, -разделенное пробелом, и подсчитывает его. Счетчики хранятся в массиве count
, который индексируется по словам. В конце выводятся отсчеты и соответствующие им слова. Это автоматически пропустит пустые строки, так как они не содержат слов.
Если вам нужно отсортировать это, передайте его через sort -n
.
Если вы используете GNU awk
, вы можете использовать его функцию asorti()
для сортировки в блоке END
:
END {
n = asorti(count, c2, "@val_num_desc")
for (i=1; i<=n; i++ )
printf("%d %s %s\n", i, count[c2[i]], c2[i])
}