【问题标题】:Need help to find average, min and max values in shell script from text file需要帮助从文本文件中查找 shell 脚本中的平均值、最小值和最大值
【发布时间】:2020-04-04 21:01:16
【问题描述】:

我现在正在编写一个 shell 脚本。我需要遍历一个文本文件,从中获取文本,然后从每行数字中找到平均数、最大数和最小数,然后将它们打印在带有每行名称的图表中。这是文本文件:

Experiment1 9 8 1 2 9 0 2 3 4 5
collect1 83 39 84 2 1 3 0 9
jump1 82 -1 9 26 8 9
exp2 22 0 7 1 0 7 3 2
jump2 88 7 6 5
taker1 5 5 44 2 3

到目前为止,我所能做的就是遍历它并像这样打印每一行:

#!/bin/bash

while read line
do
echo $line
done < mystats.txt

我是一个初学者,我在网上找到的任何东西都没有帮助我。

【问题讨论】:

    标签: bash shell


    【解决方案1】:

    一种方法,使用perl 进行所有计算:

    $ perl -MList::Util=min,max,sum -anE 'BEGIN { say "Name\tAvg\tMin\tMax" }
        $n = shift @F; say join("\t", $n, sum(@F)/@F, min(@F), max(@F))' mystats.txt
    Name    Avg     Min     Max
    Experiment1     4.3     0       9
    collect1        27.625  0       84
    jump1   22.1666666666667        -1      82
    exp2    5.25    0       22
    jump2   26.5    5       88
    taker1  11.8    2       44
    

    它使用自动拆分模式 (-a) 将每一行拆分为一个数组(很像 awk),并使用标准 List::Util 模块的数学函数来计算每行数字的平均值、最小值和最大值。


    这是一个纯粹的 bash 版本,只使用内置函数(虽然我不建议这样做;除此之外,bash 不做浮点运算,所以平均值是关闭的):

    #!/usr/bin/env bash
    
    printf "Name\tAvg\tMin\tMax\n"
    while read name nums; do
        read -a numarr <<< "$nums"
        total=0
        min=${numarr[0]}
        max=${numarr[0]}
        for n in "${numarr[@]}"; do
            (( total += n ))
            if [[ $n -lt $min ]]; then
                min=$n
            fi
            if [[ $n -gt $max ]]; then
                max=$n
            fi
        done
        (( avg = total / ${#numarr[*]} ))
        printf "%s\t%d\t%d\t%d\n" "$name" "$avg" "$min" "$max"
    done < mystats.txt
    

    【讨论】:

    • (( avg = (total * 100 + 5) / ${#numarr[*]} )); let len=${#avg}-2; avg=${avg:0:-2}.${avg:$len}
    【解决方案2】:

    使用awk

    awk '{
      min = $2; max = $2; sum = $2;
      for (i=3; i<=NF; i++) {
        if (min > $i) min = $i;
        if (max < $i) max = $i;
        sum+=$i }
      printf "for %-20s min=%10i max=%10i avg=%10.3f\n", $1, min, max, sum/(NF-1) }' mystats.txt
    

    【讨论】:

      猜你喜欢
      • 2020-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      • 2018-03-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多