gpt4 book ai didi

bash - 需要帮助从文本文件中查找 shell 脚本中的平均值、最小值和最大值

转载 作者:行者123 更新时间:2023-12-04 00:20:36 25 4
gpt4 key购买 nike

我现在正在编写一个 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

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

最佳答案

一种方法,使用 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 不做 float 学运算,所以平均值已关闭):

#!/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

关于bash - 需要帮助从文本文件中查找 shell 脚本中的平均值、最小值和最大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61034729/

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