2010-01-20 46 views
0

我有一個列表,諸如:排序列表和相加金額的shell

10,汽車輪胎
8,汽車輪胎
4,輪子
18,撬棍
5,插座
5,千斤頂
8,千斤頂

第一個數字是數量,第二個是項目名稱。我需要得到這個清單,以便它只顯示每個項目一次,並且如果項目出現多次,它將數量加在一起。這正常工作,輸出將是:

18,汽車輪胎
4,車輪
18,撬棍
18,千斤頂

這將需要在幾千年的格式列表上的工作行,最好在Linux shellcript編碼,任何幫助表示感謝,謝謝!

回答

0
awk -F"," '{ t[$2] = t[$2] + $1 } 
END{ 
    for(o in t){ 
     print o, t[o] 
    } 
}' file 

輸出

$ ./shell.sh 
Crowbars 18 
Wheels 4 
Car Tyres 18 
Jacks 18 
0

看:

man sort 
man awk 

你需要實際的命令是:

sort -n -t, +1 yourfile.txt | awk ...... 

你也可以這樣做完全是在AWK Sum by group

+0

驚人!!!!!!!! – Boolean 2010-01-20 01:08:28

+0

我懷疑它是否真的有效......我沒有看到它計算的總和。 並且語法+0已過時。 – 2010-01-20 01:34:48

0

怎麼樣perl腳本?:

#!/usr/bin/perl -w 
use strict; 

my %parts; 

while (<>) { 
    chomp; 
    my @fields = split /,/, $_; 
    if (scalar @fields > 1) { 
     if ($parts{$fields[1]}) { 
      $parts{$fields[1]} += $fields[0]; 
     } else { 
      $parts{$fields[1]} = $fields[0]; 
     } 
    } 
} 

foreach my $k (keys %parts) { 
    print $parts{$k}, ",$k\n"; 
} 
0
awk -v FS=, '{ if (! $2 in a) { 
       a[$2] = $1; 
       } 
       else { 
       a[$2] += $1; 
       } 
      } 
      END { 
       for (name in a) { 
       printf("%s\t%d\n", name, a[name]); 
       } 
      }'