Сколько раз в первом столбце файла это, кажется, имеет какую-либо букву/число?

Привет у меня есть файл, который похож на это:

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). Таким образом, я могу сделать это, но подсчет количества раз, кажется, что в первом столбце существует некоторая буква/число? Есть ли некоторый удар, управляют, чтобы я мог использовать?

0
задан 5 March 2018 в 02:46

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
1
ответ дан 30 October 2019 в 08:07

Можно использовать grep:

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

^ запуск строки, [[:alnum:]] алфавиты соответствий или числа (короткий для алфавитно-цифрового), и -c делает grep распечатайте количество.

1
ответ дан 30 October 2019 в 08:07

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

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

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

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

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

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

1
ответ дан 30 October 2019 в 08:07

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

Похожие вопросы: