Shell 计算矩阵行中的唯一数

Shell 计算矩阵行中的唯一数,shell,awk,Shell,Awk,我有一个矩阵: >ACTTT ASB 0.098 0 0 1 0 0.75 0 0.25 0 0 0 0 1 0 1 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 我想计算每行文件中出现的“0”而

我有一个矩阵:

   >ACTTT  ASB  0.098
    0   0      1    0   
 0.75   0   0.25    0   
    0   0      0    1   
    0   1      0    0   
    1   0      0    0   
    1   0      0    0   
    0   1      0    0   
    0   1      0    0   
我想计算每行文件中出现的“0”而不是“0.”(同时忽略标题),这样每行的计数将为3,2,3,3,3,3。
我尝试了echo$line | grep-o 0 | wc-l,但它也计算'0'。

下面这样的awk脚本可以工作:

script.awk

BEGIN  { ORS = "," }
NR > 1 { s =0
         for( f=1; f<= NF; f++) s+= (($f == 0) ? 1 : 0 )
         print s
       }
BEGIN{ORS=“,”}
NR>1{s=0

对于(f=1;f,类似于以下内容的awk脚本可以工作:

script.awk

BEGIN  { ORS = "," }
NR > 1 { s =0
         for( f=1; f<= NF; f++) s+= (($f == 0) ? 1 : 0 )
         print s
       }
BEGIN{ORS=“,”}
NR>1{s=0

对于(f=1;f首先要做的一件事。看起来您正在shell循环中逐行处理文件。这相当慢。您肯定应该使用awk并在运行时处理文件。其他答案说明了如何做到这一点

下面只是一个理论提示,如何使用
grep
wc
来实现它。我只关注正确的正则表达式


您可以搜索前缀为空格或行首,后跟空格或行尾的
0

grep '\(^\|[[:space:]]\)0\([[:space:]]\|$\)' a.txt | wc -l

head命令是跳过标题行。

首先要做的一件事是,您似乎正在shell循环中逐行处理文件。这相当慢。您肯定应该使用awk并在运行时处理文件。其他答案说明了如何做到这一点

$ awk 'NR>1{print gsub(/(^|[[:space:]])0([[:space:]]|$)/,"&")}' file
3
2
3
3
3
3
3
3
下面只是一个理论提示,如何使用
grep
wc
来实现它。我只关注正确的正则表达式


您可以搜索前缀为空格或行首,后跟空格或行尾的
0

grep '\(^\|[[:space:]]\)0\([[:space:]]\|$\)' a.txt | wc -l

head命令是跳过标题行。

在每个文件中使用
awk
一次肯定比在每行输入中调用
grep
+
wc
一次要好。顺便说一句,我想知道在列上迭代并检查它们是否
0
是否比正则表达式快。可能取决于行的长度,数字我真的不知道,抱歉。每个文件使用
awk
一次肯定比每行输入调用
grep
+
wc
一次要好。顺便说一句,我想知道迭代列并检查它们是否
0
比正则表达式快。可能取决于行的长度,列的数量。。我真的不知道,抱歉。不..我以前有
tail-n+1
但删除了它,因为OP似乎逐行处理文件…:)我怀疑这是因为OP还不知道问题的答案不..我以前有
tail-n+1
但删除了它,因为OP似乎逐行处理文件…)我怀疑这是因为OP还不知道这个问题的答案
$ awk 'NR>1{print gsub(/(^|[[:space:]])0([[:space:]]|$)/,"&")}' file
3
2
3
3
3
3
3
3