unix 计算通过AWK筛选器的行的百分比?

332nm8kg  于 2022-11-04  发布在  Unix
关注(0)|答案(6)|浏览(164)

我有一个文件(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
谁能帮我看看我错在哪里?

ljo96ir5

ljo96ir51#

考虑字符串:

$(cat my_file | cut -f 11 | awk '$1 < 5E-2' | wc -l)

$()构造是一个“命令替换”。$()内部的命令被执行并产生一些输出。然后该输出被作为命令执行。如果管道产生输出“1158532”,那么bash将尝试将该字符串作为命令执行。但是在您的PATH中没有命令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)"

但请注意,这将生成01,因为运算不是浮点数,而是整数。

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通常是一个反模式。

xghobddn

xghobddn2#

我想您可以通过awk来处理这一切:

awk 'BEGIN {cnt=0} { if ($11<.05) cnt+=1 } END {printf "%2.2f%%\n", cnt/NR*100}' my_file
dbf7pr2w

dbf7pr2w3#

仅使用awk

awk '$11 < 0.05 {c++} END {print c}' my_file
yzckvree

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
gcxthw6b

gcxthw6b5#

计算通过AWK筛选器的行的百分比?
我将利用GNU 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行。

  • (在gawk 4.2.1中测试)*
uqxowvwt

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

相关问题