2017-04-04 29 views
0

我知道如何在一行中進行求和,我可以使用awk.But如果情況有所不同,我該怎麼辦?例如,如何在linux shell中求和

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

我想分別得到總的每個水果。

回答

0

可以使用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 
    } 
} 
+0

謝謝。我在shell中嘗試了你的命令,併成功實現了我的目標。我需要一些時間來了解關聯數組。 – luven

0

另一種方法使用在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" 
0

GNUdatamash

datamash -W -g1 sum 2 < fruit 

輸出:

orange 4500 
apple 2000 
peach 3500