我知道如何在一行中進行求和,我可以使用awk.But如果情況有所不同,我該怎麼辦?例如,如何在linux shell中求和
orange 2000
orange 1000
orange 1500
apple 900
apple 1100
peach 1500
peach 800
peach 1200
我想分別得到總的每個水果。
我知道如何在一行中進行求和,我可以使用awk.But如果情況有所不同,我該怎麼辦?例如,如何在linux shell中求和
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開關殼體。即使水果不合格,這也是可行的。
#!/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"
謝謝。我在shell中嘗試了你的命令,併成功實現了我的目標。我需要一些時間來了解關聯數組。 – luven