我刚刚开始学习壳脚本。
我正在尝试从构造的文件中读取:
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/'
整个命令也包裹在<( )
中,并用.
来源,即变量将在当前环境中可用。