Сколько раз в первом столбце файла появляется буква / цифра?

Здравствуйте, у меня есть файл, который выглядит так:

ZC12A_MOUSE Mus musculus    Q5D1E7  PDB; 2N5J; NMR; -; A=45-89.
                    PDB; 2N5K; NMR; -; A=299-327.
                    PDB; 2N5L; NMR; -; A=544-596.
                    PDB; 5H9V; X-ray; 2.75 A; A/B/C/D=134-339.
                    PDB; 5H9W; X-ray; 2.60 A; A/B=134-339.

ZHX1_HUMAN  Homo sapiens    Q9UKY1  PDB; 2ECB; NMR; -; A=565-640.
                    PDB; 2GHF; NMR; -; A=60-153.
                    PDB; 2LY9; NMR; -; A=462-532.
                    PDB; 3NAR; X-ray; 2.60 A; A/B=655-731.

ZHX2_HUMAN  Homo sapiens    Q9Y6X8  PDB; 2DMP; NMR; -; A=524-599.
                    PDB; 3NAU; X-ray; 2.70 A; A/B=444-501.

Я пытаюсь сосчитать "блоки" в файле (здесь у меня 3). Так что я могу сделать это, но считая количество раз, когда кажется, что в первом столбце есть какая-то буква / цифра? Есть ли какая-нибудь команда bash, которую я мог бы использовать?

3 ответа

Решение

Строки, которые не начинаются с пробелов, легко подобрать awk:

$ awk '/^\S/' test
ZC12A_MOUSE Mus musculus    Q5D1E7  PDB; 2N5J; NMR; -; A=45-89.
ZHX1_HUMAN  Homo sapiens    Q9UKY1  PDB; 2ECB; NMR; -; A=565-640.
ZHX2_HUMAN  Homo sapiens    Q9Y6X8  PDB; 2DMP; NMR; -; A=524-599.

Если вы просто хотите посчитать это, вы можете передать это в wc -l который считает строки из ввода:

$ awk '/^\S/' test | wc -l
3

Вы также можете делать более сложные вещи с помощью awk - вот почему я выбрал его - например, отделив первое поле от строк без начальных пробелов:

$ awk '/^\S/ {print $1}' test
ZC12A_MOUSE
ZHX1_HUMAN
ZHX2_HUMAN

И оттуда вы можете сосчитать уникальные экземпляры каждого из них. Единственное условие для этого - вам нужно сначала отсортировать. К счастью, в базовой установке есть инструменты для всего этого:

$ awk '/^\S/ {print $1}' test | sort | uniq -c
      1 ZC12A_MOUSE
      1 ZHX1_HUMAN
      1 ZHX2_HUMAN

Если вы работаете с файлами, состоящими из многострочных записей, вам следует ознакомиться с режимом абзаца в awk, который достигается установкой пустого разделителя записей. RS,

Так, например, чтобы напечатать количество записей (блоков) в вашем файле, вы можете просто сбросить RS и затем выведите количество записей, обработанных в конце:

awk -vRS= 'END {print NR}' file

Если вы хотите напечатать первое поле каждой многострочной записи, это просто

$ awk -vRS= '{print $1}' file
ZC12A_MOUSE
ZHX1_HUMAN
ZHX2_HUMAN

и так далее - без необходимости прибегать к сопоставлению регулярных выражений.

Ты можешь использовать grep:

grep -c '^[[:alnum:]]' input-file

^ это начало строки, [[:alnum:]] соответствует алфавиту или цифрам (сокращенно от al ph numric) и -c марки grep распечатать счет.

Другие вопросы по тегам