Моя обычная идиома для подсчета количества вхождений данной строки в некоторый ввод текста - это
… | sort | uniq -c | sort -n
с последним sort -n
, необязательно используемым для сортировки строк по количеству вхождений. Однако недавно я столкнулся с ситуацией, когда первые три строки данных были заголовком, и их включение при сортировке и подсчете значительно ухудшало читаемость.
Какой самый элегантный способ просто сделать отступ в первых трех строках ввода (чтобы учесть поле счетчика), но не отсортировать их?
На момент написания этого вопроса моим лучшим решением было это:
… | { for i in 1 2 3; do read -r i; printf ' %s\n' "$i"; done;
sort | uniq -c | sort -n; }
Таким образом, вывод направляется в группу, которая читает три строки и печатает их с отступом в 8 пробелов (, что представляет собой объем пространства, используемого uniq -c
для хранения количества строк и разделительного пробела ), затем оставшаяся часть ввода этой группы перенаправляется на sort
и uniq
.
Думаю, я мог бы написать вышеописанное как сценарий оболочки где-нибудь, возможно, с числом строк в качестве аргумента, чтобы мне не приходилось -вводить его повторно для каждого такого использования.