如何在linux shell中进行求和

如何在linux shell中进行求和,linux,bash,Linux,Bash,我知道如何在一行中求和,我可以使用awk。但是如果情况不同,我应该怎么做?比如说, orange 2000 orange 1000 orange 1500 apple 900 apple 1100 peach 1500 peach 800 peach 1200 我想分别得到每种水果的总数。您也可以使用awk通过使用关联数组: pax> echo 'orange 2000 orange 1000 orange 150

我知道如何在一行中求和,我可以使用awk。但是如果情况不同,我应该怎么做?比如说,

orange     2000
orange     1000
orange     1500
apple      900
apple      1100
peach      1500
peach      800
peach      1200

我想分别得到每种水果的总数。

您也可以使用
awk
通过使用关联数组:

pax> echo 'orange 2000
orange 1000
orange 1500
apple 900
apple 1100
peach 1500
peach 800
peach 1200' | awk 'NF>=2{sum[$1]+=$2}END{for(i in sum){print i" "sum[i]}}'

orange 4500
apple 2000
peach 3500

详细查看脚本:

NF >= 2 {                   # Want at least two fields
    sum[$1] += $2           # For each line, add to sum for that key
}
END {                       # After all lines processed.
    for (i in sum) {        # Process each key in sum array
        print i" "sum[i]    # Output key and sum
    }
}

另一种方法是在bash中使用switch case。即使果实不整齐,这也会起作用

#!/bin/bash

file=fruits.txt

while read -r line
do
        fruit=`echo $line | awk '{ print $1 }'`

        case "$fruit" in
                orange )
                value=`echo $line | awk '{ print $2 }'`
                val_or=`expr $val_or + $value`
                ;;

                apple )
                value=`echo $line | awk '{ print $2 }'`
                val_ap=`expr $val_ap + $value`
                ;;

                peach )
                value=`echo $line | awk '{ print $2 }'`
                val_pe=`expr $val_pe + $value`
                ;;
        esac
done < $file
        echo "orange: $val_or\napple: $val_ap\npeach: $val_pe\n"
#/bin/bash
file=fruits.txt
而read-r行
做
水果=`echo$line | awk'{print$1}'`
大写“$FROUT”
(橙色)
value=`echo$line | awk'{print$2}'`
val_or=`expr$val_or+$value`
;;
(苹果)
value=`echo$line | awk'{print$2}'`
val_ap=`expr$val_ap+$value`
;;
桃子)
value=`echo$line | awk'{print$2}'`
val_pe=`expr$val_pe+$value`
;;
以撒
完成<$file
echo“橙色:$val\u或\napple:$val\u ap\n每个:$val\u pe\n”
GNU:


非常感谢。我在shell中尝试了你的命令,并成功地实现了我的目标。我需要一些时间来理解关联数组。
datamash -W -g1 sum 2 < fruit 
orange  4500
apple   2000
peach   3500