-1

bcを使用して配列内の要素を合計しようとしています。名前が3回表示される場合、名前とその値を含むファイルがあります。その値に3を掛けてから、すべての要素の合計を一緒に見つける必要があります。標準入力エラーが表示されます

$ cat foo.txt

max 2.3 
henry 3
fransis 4.5
max 2.3
henry 3
max 2.3

端末に表示されるはずです

max 6.9
henry 6 
fransis 4.5

それから

total 17.9
declare -A array

while read name value; do

     array[$name]=$( echo "${array[$name]:-0} + $value" | bc )

done < cat foo.txt

for name in "${!array[@]}"; do

     echo "$name ${array[$name]}"

done
4

3 に答える 3

1

使用する必要があるかどうかはわかりませんがbc、次のawkコマンドで実行できます。

awk '{names[$1]=$1;vals[$1]+=$2} END {for(i in names){sum+=vals[i];print i, vals[i]}; print "total " sum}' foo.txt
于 2011-12-07T16:25:34.260 に答える
1

真の bash 精神で、これを実現するための一連のパイプ コマンドを次に示します :)

echo 'max 2.3
henry 3
fransis 4.5
max 2.3
henry 3
max 2.3' | \
sort | \
uniq -c | \
while read count name value
  do echo "$name" $(bc <<< "$count * $value")
done | \
sort -r -k 2

sort | uniq -c同一の行の数を数え、次のようなリストを生成します。

1 fransis 4.5
2 henry 3
3 max 2.3

whileこのリストは、一度に 3 つの値を読み取るループに渡されます ( read count name value)

3 つの値のセットごとに、名前と乗算結果が出力されます。

echo "$name" $(bc <<< "$count * $value")

結果は、最高スコアが一番上になるように並べ替えられます。つまり、2 番目の列で逆並べ替えを行います。

sort -r -k 2

これはすべて、入力ファイルが「整形式」であり、不正な行や余分な空白がないことを前提としています。

于 2011-12-07T23:30:59.503 に答える
0

cat行から単語を削除しdone < cat foo.txtます。

更新:入力ファイルから空の行も削除します。

于 2011-12-07T17:20:14.640 に答える