我有一个文件(my_file),想计算第11列中有多少个值小于.05:我试试:
echo $($(cat my_file | cut -f 11 | awk '$1 < 5E-2' | wc -l) / $(cat my_file | cut -f 11 | wc -l))
我得到1158532: command not found谁能帮我看看我错在哪里?
1158532: command not found
ljo96ir51#
考虑字符串:
$(cat my_file | cut -f 11 | awk '$1 < 5E-2' | wc -l)
$()构造是一个“命令替换”。$()内部的命令被执行并产生一些输出。然后该输出被作为命令执行。如果管道产生输出“1158532”,那么bash将尝试将该字符串作为命令执行。但是在您的PATH中没有命令1158532,所以你会看到错误信息。你真的应该在awk中这样做:
$()
bash
1158532
awk
awk '$11 < 0.05 {c++} END {printf "%2.2f%%\n", 100.0 * c / NR}' my_file
为了帮助理解命令不起作用的原因,考虑将其“修复”为:
expr "$( cat my_file | cut -f 11 | awk '$1 < 5E-2' | wc -l)" / "$(cat my_file | cut -f 11 | wc -l)"
但请注意,这将生成0或1,因为运算不是浮点数,而是整数。
0
1
echo "$( cat my_file | cut -f 11 | awk '$1 < 5E-2' | wc -l)" / "$(cat my_file | cut -f 11 | wc -l)" | bc -l
请注意,所有这些UUOC都应该被删除(例如,使用< my_file cut -f 11),而cut | awk通常是一个反模式。
< my_file cut -f 11
cut | awk
xghobddn2#
我想您可以通过awk来处理这一切:
awk 'BEGIN {cnt=0} { if ($11<.05) cnt+=1 } END {printf "%2.2f%%\n", cnt/NR*100}' my_file
dbf7pr2w3#
仅使用awk:
awk '$11 < 0.05 {c++} END {print c}' my_file
yzckvree4#
下面是一个如何将命令的各个部分转换为更短的等效命令的示例:
cat my_file | cut -f 11 | wc -l cat my_file | wc -l wc -l < my_file cat my_file | cut -f 11 | awk '$1 < 5E-2' | wc -l cat my_file | awk -F'\t' '$11 < 5E-2' | wc -l awk -F'\t' '$11 < 5E-2' my_file | wc -l awk -F'\t' '$11 < 5E-2 {c++} END {print c}' my_file
要将两个结果相除:
awk -F'\t' '$11 < 5E-2 {c++} END {print c/NR}' my_file 0.666667
gcxthw6b5#
计算通过AWK筛选器的行的百分比?我将利用GNU AWK来完成这个任务,如下所示,让file.txt内容
AWK
file.txt
0.01 0.03 0.05 0.07 0.09
然后
awk '{cnt+=$1<0.05}END{print cnt/NR*100 "%"}' file.txt
给出输出
40%
说明:比较给出0或1,所以我使用+=,当条件不满足时增加0,当条件成立时增加1。处理完所有行后,我简单地通过将cnt除以NR(在END中是所有行的数量)并乘以100来计算百分比。免责声明:该解决方案假设file.txt具有不少于1行。
+=
100
uqxowvwt6#
{m,g}awk ' BEGIN { ___=((_+=++_+_)*_+(\ __=_*_+—-_) )^-!(_ -= _) } { _+=+($__)<___ } END { printf("\n\n\tFilter hit rate :: %.*f %% ( %\47.f / %\47.f )"\ " \n\n\t%*sFile :: %-.*s \n\n", ___=__--,__*_*__/(__=NR),_,__, ___,____,_^=_*=_+=_^=_<_, FILENAME) } ' my_file
|
Filter hit rate :: 0.04415484271 % ( 3,588 / 8,125,949 ) File :: myfile
6条答案
按热度按时间ljo96ir51#
考虑字符串:
$()
构造是一个“命令替换”。$()
内部的命令被执行并产生一些输出。然后该输出被作为命令执行。如果管道产生输出“1158532”,那么bash
将尝试将该字符串作为命令执行。但是在您的PATH中没有命令1158532
,所以你会看到错误信息。你真的应该在awk
中这样做:为了帮助理解命令不起作用的原因,考虑将其“修复”为:
但请注意,这将生成
0
或1
,因为运算不是浮点数,而是整数。请注意,所有这些UUOC都应该被删除(例如,使用
< my_file cut -f 11
),而cut | awk
通常是一个反模式。xghobddn2#
我想您可以通过
awk
来处理这一切:dbf7pr2w3#
仅使用
awk
:yzckvree4#
下面是一个如何将命令的各个部分转换为更短的等效命令的示例:
要将两个结果相除:
gcxthw6b5#
计算通过AWK筛选器的行的百分比?
我将利用GNU
AWK
来完成这个任务,如下所示,让file.txt
内容然后
给出输出
说明:比较给出0或1,所以我使用
+=
,当条件不满足时增加0,当条件成立时增加1。处理完所有行后,我简单地通过将cnt除以NR(在END中是所有行的数量)并乘以100
来计算百分比。免责声明:该解决方案假设file.txt
具有不少于1行。uqxowvwt6#
|