我试图在不指定特定字符串的情况下计算出现次数,仅使用 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 提供了可以轻松做到这一点的语法。