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