У меня есть файл с количеством строк в filename
.
Я хочу посчитать, сколько строк начинаются с символа «a», с «b» и так далее за один раз.
Какую команду я должен выполнить.?
У меня есть файл с количеством строк в filename
.
Я хочу посчитать, сколько строк начинаются с символа «a», с «b» и так далее за один раз.
Какую команду я должен выполнить.?
Не совсем уверен, что я правильно понимаю ваш вопрос, это то, что вы ищете?
$ cat foo.input
afoo
abar
bfoo
bbar
bquux
cfoo
$ awk '{a[substr($0, 1, 1)]++}END{for (c in a)print c, a[c]}' foo.input
a 2
b 3
c 1
Другое, более простое решение - использовать colrm
и uniq
:
$ colrm 2 < foo.input | uniq -c
2 a
3 b
1 c
Это идеальная работа для uniq
:
uniq -c -w 1 filename
-w 1
сравнивает только первый символ каждой строки; -c
подсчитывает вхождения.
С помощью foo.input
из ответа Адриана вы получите (не путайте afoo
, bfoo
т. Д .; это просто первые строки, начинающиеся с a
, b
и т.д.)
2 afoo
3 bfoo
1 cfoo
Передайте результат через sort -n
, если вы хотите отсортировать его по количеству вхождений:
$ uniq -c -w 1 foo.input | sort -n
1 cfoo
2 afoo
3 bfoo
Или, если вы больше используете Perl и grep:
perl -le '$, = "\n"; print ("a".."z")' | xargs -i grep -c '^{}' foo.input
Другое решение, потому что иногда легче запомнить небольшие блоки и собрать их:
$ cat foo.input afoo abar bfoo bbar bquux cfoo $ cat foo.input | cut -c 1 | tr '[[:upper:]]' '[[:lower:]]' | sort | grep '^[a-z]'| uniq -c 2 a 3 b 1 c
Объяснение однострочника:
cat
прочитал файлcut -c 1
обрезает все, кроме первого символа каждой строкиtr '[[:upper:]]' '[[:lower:]]'
заменяет прописные на строчныеsort
... сортирует строкиgrep '^[a-z]'
удалить строки, не начинающиеся с буквыuniq -c
считает одинаковые строки