У меня есть файл с количеством строк в filename .

Я хочу посчитать, сколько строк начинаются с символа «a», с «b» и так далее за один раз.

Какую команду я должен выполнить.?

4 ответа4

4

Не совсем уверен, что я правильно понимаю ваш вопрос, это то, что вы ищете?

$ 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
2

Это идеальная работа для 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
1

Или, если вы больше используете Perl и grep:

perl -le '$, = "\n"; print ("a".."z")' | xargs -i grep -c '^{}' foo.input
1

Другое решение, потому что иногда легче запомнить небольшие блоки и собрать их:

$ 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 считает одинаковые строки

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .