文件的第一列中出现字母/数字的次数是多少?

文件的第一列中出现字母/数字的次数是多少?

你好,我有一个如下文件:

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 命令吗?

答案1

使用以下类似方法可以轻松抓取不以空格开头的行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

答案2

您可以使用grep

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

^是行的开头,[[:alnum:]]匹配字母或数字(艾尔數量eric),并使打印-c成为grep可能。

答案3

如果你正在处理由多行记录组成的文件,那么你应该熟悉 awk 的段落模式这是通过设置空的记录分隔符来实现的RS

例如,要打印文件中的记录数(块数),您可以简单地取消设置RS,然后打印最后处理的记录数:

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

如果你想打印每个多行记录的第一个字段,那么很简单

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

等等——无需诉诸正则表达式匹配。

相关内容