如何在单独的每行变量中连续找到每个数字并将平均存储



我刚刚开始学习壳脚本。

我正在尝试从构造的文件中读取:

harddrive1 10 20 30 40
harddrive2 20 30 40 50
harddrive3 30 40 50 60

我想以某种方式将每行的平均值保存在单独的变量中...只有3行,5列。所以我的输出将是:

hd_AVG1=20
hd_AVG2=35
hd_AVG3=45

我该如何完成?

编辑:我需要将其保存在不同的变量中,以便我调用变量...例如

if [[ $hd_AVG1 -eq 20 ]];
    then 
    do something...
elif [[ $hd_AVG2 -gt 40 ]];
    then
    do something...
fi
$ awk '{print $1"="($2+$3+$4+$5)/4}' file
harddrive1=25
harddrive2=35
harddrive3=45

这个bash脚本应该做你想要的。它调用bc进行浮动算术,因为bash无法本身。

#!/bin/bash
while read -a line ; do
    sum=0
    for ((i=1; i<${#line[@]}; i++)) ; do
        let sum+=line[i]
    done;
    hd[j++]=$(bc -l <<< "$sum/($i-1)")
done < input
echo ${hd[0]} ${hd[1]} ${hd[2]}

with Perl(非常便携):

perl -lane 'print $F[0] . "=" . ($F[1] + $F[2] + $F[3] + $F[4]) / 4' file.txt

使用我刚刚从@steve学到的数组种群技巧:

$ cat file
harddrive1 10 20 30 40
harddrive2 20 30 40 50
harddrive3 30 40 50 60
$
$ hd_AVG=($(awk '{print ($2+$3+$4+$5)/4}' file))
$ echo "${hd_AVG[0]}"
25
$ echo "${hd_AVG[1]}"
35
$ echo "${hd_AVG[2]}"
45

您可以使用coreutils和sed这样做:

. <(paste -d=                                                   
      <(cut -d' ' -f1  infile                                 ) 
      <(cut -d' ' -f2- infile  | sed 's/$/ + + + 4 / p/' | dc) 
   )
echo $harddrive1 $harddrive2 $harddrive3

输出:

25 35 45

解释

<( )符号在FIFO中运行命令并输出输出,因此paste将两个管道和列以=作为定界符的输出。

第二个cut从文件中获取数字,sed将适当的操作员附加到数字上,并让dc进行计算。dc的输入看起来像:

cut -d' ' -f2- infile | sed 's/$/ + + + 4 / p/'

输出:

10 20 30 40 + + + 4 / p
20 30 40 50 + + + 4 / p
30 40 50 60 + + + 4 / p

dc是反向抛光计算器;它支持任意精度,但需要告诉使用小数。这将使dc使用两个小数:

cut -d' ' -f2- dims | sed 's/^/2k/; s/$/ + + + 4 / p/'

整个命令也包裹在<( )中,并用.来源,即变量将在当前环境中可用。

相关内容

  • 没有找到相关文章

最新更新