$ awk '{ print length }' file | sort -n | uniq -c | awk '{ printf("%d character words: %d\n", $2, $1) }'
2 character words: 3
5 character words: 1
7 character words: 1
Первый awkфильтр просто напечатает длину каждой строки в вызываемом файле file. Я предполагаю, что этот файл содержит одно слово в строке.
В sort -n(сортировка линии с выхода awkчисленно в порядке возрастания) и uniq -c(подсчитать количество раз , каждая строка происходит последовательно) , а затем создаст следующий вывод из что для приведенных данных:
3 2
1 5
1 7
Затем он анализируется вторым awkсценарием, который интерпретирует каждую строку как «число X строк, содержащих символы Y» и выдает желаемый результат.
Альтернативное решение состоит в том, чтобы сделать все это awkи вести подсчет длин в массиве. Это компромисс между эффективностью, удобочитаемостью / простотой понимания (и, следовательно, удобством обслуживания), какое решение является «лучшим».
Альтернативное решение:
$ awk '{ len[length]++ } END { for (i in len) printf("%d character words: %d\n", i, len[i]) }' file
2 character words: 3
5 character words: 1
7 character words: 1