如何统计文件中所有字符串出现的次数,同时获取每个字符串的平均值

如何统计文件中所有字符串出现的次数,同时获取每个字符串的平均值

我试图在不指定特定字符串的情况下计算出现次数,仅使用 cut 命令的输出来使用 grep 打印每个重复字符串的数量。然后我想使用 numaverage 获得平均值,但我不确定如何在不首先删除数字的情况下完成此操作。
我首先使用命令 cut -d " " -f 1 $file 将文件减半以仅查看左侧:

NEUTRON   20.900103
PION-      0.215176
PION-     22.716532
NEUTRON    8.043279
PION+      1.374297
PION-      0.313350
PION+      0.167848

到那时只是

NEUTRON  
PION-     
PION-     
NEUTRON    
PION+      
PION-      
PION+      

我怎么能|以这种方式一起 cut、grep、numaverage(其他命令可能有帮助,例如 cat、uniq、wc)?前输出:

Name          count     Average
KAON-            1      5.489958
NEUTRON          2      14.471691
PHOTON          10      0.652727
PION-            5      5.145192
PION+            7      2.691639
PROTON           1      1.160216

答案1

使用csvsql来自csvkit

如果您的文件是空格分隔的:

csvsql -d' ' -S -H --query 'select a as Name, count(*) as count, avg(b) as Average from file group by a' file \
    | csvformat -D' '

或者如果您的文件是制表符分隔的:

csvsql -t -S -H --query 'select a as Name, count(*) as count, avg(b) as Average from file group by a' file \
    | csvformat -T

输出:

Name    count   Average
NEUTRON 2   14.471691
PION+   2   0.7710725
PION-   3   7.74835266667

您可能需要使用以下命令安装它pip

pip install csvkit

答案2

尝试awk

awk '
    BEGIN{FS=OFS="\t"} # if your file is space-delimited, leave this out
    {c[$1]++;v[$1]+=$2}
    END{
        print "Name","count","Average"
        for(f in c){print f,c[f],v[f]/c[f]}
    }
' file

答案3

我喜欢这两个答案(SQL、AWK),因为它们是标准语言并以惯用的方式实现算法。不过,我本来打算进一步否决 Q,因为它似乎坚持特定的解决方案。

但这正是 fgdark 的问题:您过于依赖实用程序并且不了解所涉及的算法。

我如何在这个庄园中将 cut、grep、numaverage 连接在一起(其他命令可能会有所帮助,例如 cat、uniq、wc)?

您可以通过从临时文件开始“轻松”找到管道解决方案,当链工作时,您可以将其通过管道连接在一起。结果会不尽如人意。首先,我没有平均数。表现也。

这里,需要一些“真正的”编程语言,例如 SQL 或 AWK。或 perl 或 python 或 C。或 bash - 但 bash 作为脚本语言关联数组算术运算符,而不是“仅”将 bash 作为 shell。

你不需要平均()功能与 SQL 解决方案一样,您只需对读入数组的数据进行计数、添加和除法即可。

因此,如果您想做更多的数据报告,您应该选择语言。 SQL有点特殊,对数据的强项矿业。其他提到的(awk、perl、python、C,甚至 bash)在数据方面都很强大加工(操作变量/数组/结构)。但有很大的重叠。


我使用 SQL 已经有几年了;这就是我保存查询及其调用的方式:

SQL='select a as Name, count(*) as Count, avg(b) as Average' 
SQL+=' from file'
SQL+=' group by a'

csvsql -tSH --query $SQL file | csvformat -T

这不是批评,而是试图说明结构化查询语言是如何的 -结构化的。这是group by带有聚合函数count和 的子句的教科书演示avg

+=Bash 提供了可以轻松做到这一点的语法。

相关内容