Сколько раз в первом столбце файла появляется буква / цифра?
Здравствуйте, у меня есть файл, который выглядит так:
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
распечатать счет.