2010-01-20 9 views
0

J'ai une liste telle que:Tri Liste et addition de quantités shellscript

10, Pneus auto
8, Pneus auto
4, Roues
18, Pinces
5, Jacks
5, Vérins
8, vérins

Le premier nombre est la quantité, le second est le nom de l'article. J'ai besoin d'obtenir cette liste pour qu'elle ne montre qu'une seule fois chaque élément et qu'elle additionne la quantité si l'item apparaît plus d'une fois. La sortie de ce travail serait bien être:

18, Pneus auto
4, Roues
18, Pinces
18, Jacks

Il devra travailler sur les listes dans ce format de quelques milliers lignes, de préférence codées dans Linux shellscript, toute aide appréciée, merci!

Répondre

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

sortie

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

Regardez:

man sort 
man awk 

La commande réelle dont vous avez besoin est:

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

Vous pouvez aussi le faire entièrement en awk Sum by group

+0

!!!!!!!! Incroyable – Boolean

+0

je doute que cela fonctionne vraiment ... je ne l'ai pas vu calculer la somme. et la syntaxe +0 est obsolète. –

0

Que diriez-vous d'un script 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]); 
       } 
      }'