0

シェルスクリプトの学習を始めたばかりです。

次のような構造のファイルから読み取ろうとしています。

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
4

5 に答える 5

6
$ awk '{print $1"="($2+$3+$4+$5)/4}' file
harddrive1=25
harddrive2=35
harddrive3=45
于 2012-10-17T16:07:10.990 に答える
2

@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
于 2012-10-18T15:54:18.387 に答える
2

あり(非常にPerlポータブル):

perl -lane 'print $F[0] . "=" . ($F[1] + $F[2] + $F[3] + $F[4]) / 4' file.txt
于 2012-10-17T16:49:51.750 に答える
2

このbashスクリプトは、あなたが望むことをするはずです。bcbashはそれ自体を実行できないため、浮動小数点演算を実行するために呼び出します。

#!/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]}
于 2012-10-17T16:14:11.527 に答える
1

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、2 つのパイプを見=て、区切り記号として出力を列に並べます。

2 つ目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小数点以下2桁が使用されます。

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

コマンド全体も にラップされ<( )てソース化され.ます。つまり、変数は現在の環境で使用できます。

于 2012-10-17T17:27:38.037 に答える