背景
我有一个文本文件,命名blood_conc.txt
如下:
0, 0, 0, 0, 0, 0, 0, 1.32006590271e-05, 1.990014992001e-05, 1.504668143682e-05, 2.176900659261e-06,
7.673488970859e-06, 2.169217049562e-05, 4.343183585883e-05, 0, 0, 0, 0, 0, 0, 0,
2.143804950099e-05, 0, 0, 1.849919603625e-06, 0, 0, 0, 0, 0, 0, 0, 4.123812986073e-07, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0.0001365177, 7.81009e-06, 2.695291e-07, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0,
0, 0, 0, 0, 0, 0, 0, 2.1799e-05, 1.82574e-05, 1.68109e-05, 2.722782e-05,
5.355517e-05, 8.196468e-05, 7.177729e-05, 7.863765e-05, 5.774439e-05,
1.329413e-08, 0, 0, 0, 4.320018e-06, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0.0003335425, 0, 0, 0, 0, 0, 0, 0, 0, 6.061237e-05, 6.36887e-05,
2.250928e-05, 0, 0, 7.327124e-07, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
我想数一下有多少个0第 3 行到第 8 行(含)之间。 IE
2.143804950099e-05, 0, 0, 1.849919603625e-06, 0, 0, 0, 0, 0, 0, 0, 4.123812986073e-07, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0.0001365177, 7.81009e-06, 2.695291e-07, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0,
0, 0, 0, 0, 0, 0, 0, 2.1799e-05, 1.82574e-05, 1.68109e-05, 2.722782e-05,
5.355517e-05, 8.196468e-05, 7.177729e-05, 7.863765e-05, 5.774439e-05,
和频率0应该是54。
我想要一个简单的命令行来完成两项任务:
任务1: 统计数量0在第 3 行到第 8 行的文本中。
任务2:计算间隔之间的值的数量,如 (2.452555e-05, 0.0032784)。
我的想法
我在网络和帖子中做了一些搜索。我发现awk
并且grep -c
可能会有所帮助。
为了集中线条范围,我想我可以使用awk 'NR==3, NR==8' blood_conc.txt
.
但是,我不知道如何使用grep
or继续操作perl
。我想要一个简单的命令行,它只返回频率。
答案1
您可以尝试以下方法awk
:
awk -F"," 'NR == 3, NR == 8 { for (i = 1; i <= NF; i++) { if ($i == 0) { cnt++; } if ($i >= 2.452555e-05 && $i <= 0.0032784) { cnt1++; } } } END { print cnt, cnt1; }' file
答案2
你的出发点是好的;现在您必须迭代字段,其中前提条件是定义适当的字段分隔符。计算零的个数:
awk '
BEGIN { FS="[, ]+" }
NR==3, NR==8 { for (i=1; i<=NF; i++) if ($i==0) c++ }
END { print c }
'
要检查范围,请if
相应地更改条件,例如:if ($i >= ... && $i <= ...)
。