Сортировка списка и сложение сумм - PullRequest
0 голосов
/ 20 января 2010

У меня есть список, такой как:

10, автомобильные шины
8, Автомобильные Шины
4, Колесо
18, Ломы
5, Jacks
5, Jacks
8, домкраты

Первое число - это количество, второе - название товара. Мне нужно получить этот список, чтобы он отображал каждый элемент только один раз и суммировал количество, если элемент появляется более одного раза. Результат этой работы правильно будет:

18, Автомобильные шины
4, Колесо
18, Ломы
18, домкраты

Для этого потребуется работать со списками в этом формате из нескольких тысяч строк, желательно с кодировкой в ​​оболочке Linux, любая помощь приветствуется, спасибо!

Ответы [ 4 ]

0 голосов
/ 20 января 2010
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]);
               } 
             }'
0 голосов
/ 20 января 2010
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 голосов
/ 20 января 2010

Как насчет 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 голосов
/ 20 января 2010

Посмотрите на:

man sort
man awk

Фактическая команда, которая вам нужна:

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

Вы также можете сделать это полностью в awk Сумма по группам

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...