你好,我有一个如下文件:
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
等等——无需诉诸正则表达式匹配。