gpt4 book ai didi

linux - 计算linux文件中的最小值、最大值、计数

转载 作者:太空宇宙 更新时间:2023-11-04 05:53:55 25 4
gpt4 key购买 nike

我在 Linux 服务器上有一个文件,其中包含如下数据:

a   22
a 10
a 17
a 51
a 33
b 51
b 47
c 33

我想要一个 shell 脚本或 Linux 命令来查找第 1 列中每个值的最小值、平均值、90%、最大值和计数。

示例:

for a min = 10, avg = 26, 90% = 33, max = 51, and count = 5.

最佳答案

这里的版本甚至有 90% 的百分位使用 gawk。

百分位的定义是由下式给出的维基百科并称为Nearest rank .

轮次函数可以找到 here .

#!/bin/bash

gawk '
function round(x, ival, aval, fraction)
{
ival = int(x) # integer part, int() truncates

# see if fractional part
if (ival == x) # no fraction
return ival # ensure no decimals

if (x < 0) {
aval = -x # absolute value
ival = int(aval)
fraction = aval - ival
if (fraction >= .5)
return int(x) - 1 # -2.5 --> -3
else
return int(x) # -2.3 --> -2
} else {
fraction = x - ival
if (fraction >= .5)
return ival + 1
else
return ival
}
}
# the following block processes all the lines
# and populates counters and values
{
if($1 in counters) {
counters[$1]++;
} else {
counters[$1] = 1;
}
i = counters[$1];
values[$1, i] = $2;
} END {
for (c in counters) {
delete tmp;
min = values[c, 1];
max = values[c, 1];
sum = values[c, 1];
tmp[1] = values[c, 1];
for (i = 2; i <= counters[c]; i++) {
if (values[c, i] < min) min = values[c, i];
if (values[c, i] > max) max = values[c, i];
sum += values[c, i];
tmp[i] = values[c, i];
}

# The following 3 lines compute the percentile.
n = asort(tmp, tmp_sorted);
idx = round(0.9 * n + 0.5); # Nearest rank definition
percentile = tmp_sorted[idx];

# Output of the statistics for this group.
printf "for %s min = %d, avg = %f, 90 = %d,max = %d, count = %d\n", c, min, (sum / counters[c]), percentile, max, counters[c];
}
}'

运行执行:

./stats.sh < input.txt

我假设上述脚本名为 stats.sh 并且您的输入保存在 input.txt 中。

输出为:

for a min = 10, avg = 26.600000, 90 = 51,max = 51, count = 5
for b min = 47, avg = 49.000000, 90 = 51,max = 51, count = 2
for c min = 33, avg = 33.000000, 90 = 33,max = 33, count = 1

解释如下:

counters是一个关联数组,键是第1列的值该值是在每个输入中找到的值的数量第 1 列中的值。

values 是二维的(value_in_column_one, counter_per_value)数组,将所有值按第一列中的值分组。

在脚本末尾,最外层循环遍历所有值在第 1 列中找到。最里面的 for 循环分析属于的所有值为第 1 列中的特定值,并计算所有静态数据。

关于linux - 计算linux文件中的最小值、最大值、计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18462714/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com