Группировать по и сумме в сценарии оболочки без awk

У меня есть файл вроде:

$ cat input.csv 201,100 201,300 300,100 300,500 100,400 

Я хочу добавить значения в столбце 2, которые имеют одинаковое значение в столбце 1. Ожидаемый результат выглядит следующим образом:

 $ cat output.csv 201,400 300,600 100,400 

Я попытался сделать это командой awk но он не работает в Solaris. Пожалуйста, предоставьте альтернативу.

3 Solutions collect form web for “Группировать по и сумме в сценарии оболочки без awk”

Pure bash , однострочный:

 unset xy sum; while IFS=, read xy; do ((sum[$x]+=y)); done < input.csv; for i in ${!sum[@]}; do echo $i,${sum[$i]}; done 

Или в более читаемой форме:

 unset xy sum while IFS=, read xy; do ((sum[$x]+=y)); done < input.csv for i in ${!sum[@]}; do echo $i,${sum[$i]} done 

Результат:

 100,400 201,400 300,600 

Я думаю, что это будет сделано:

 awk 'BEGIN{FS=OFS=","}{a[$1]+=$2}END{ for (i in a) print i,a[i]}' 

С помощью python это можно сделать более эффективно. Эта программа по умолчанию ожидает, что файл будет называться как «file.txt», который вы можете изменить, если это необходимо.

 #!/usr/bin/env python3 col1, col2 = [ list(y) for y in zip(*[ x.strip().split(',') for x in open('file.txt').readlines() if x != '\n' ]) ] for (offset,x) in enumerate(list(col1)): value = 0 while col1.count(x) > 1: index = col1.index(x) col1.pop(index) value = int(col2.pop(index)) index = col1.index(x) col2[index] = int(col2[index]) + value for x, y in zip(col1, col2): print(x,',',y) 

Вывод:

 201 , 400 300 , 600 100 , 400 
  • SED или AWK: добавьте символ в каждую строку после найденного шаблона
  • В POSIX sed период (точка) соответствует новой строке в многострочном пространстве шаблонов?
  • Есть ли более быстрый способ получить этот выходной файл в Linux?
  • Как прочитать файл свойств через мой скрипт?
  • Вставьте новые строки с отсутствующими значениями (NA)
  • Многострочная обработка текста: редактирование sshd_config
  • Выберите строки, начинающиеся с определенных номеров
  • BSD sed: заменить только N-е вхождение шаблона
  • Найти последнее появление строки в нескольких файлах
  • Как выполнить действие только в первой строке?
  • Почему не матч SHA?
  • Interesting Posts

    Пошаговые инструкции для загрузки всего: (yum -y groupinstall «Рабочий стол» «Настольная платформа» «X Window System» «Шрифты»)

    Как заменить строку содержимым файла и вокруг содержимого некоторым текстом?

    Минимальные права доступа к файлу для переименования файла

    Fedora 17 не обнаруживает некоторые нажатия клавиш

    Как удалить файлы с помощью ~?

    Псевдоним команды для уничтожения остановленных заданий

    Автозаполнение Bash с помощью команды vim

    Grep не соответствует символам без ascii

    Плохая производительность сети от виртуальной машины KVM

    Значение ссылки по умолчанию для папок по умолчанию

    Как я отсоединяюсь, а затем снова присоединяюсь к сеансу специи kvm?

    Как долго Debian будет поддерживать Gnome 2?

    Как написать программу запуска приложений, которая запустит Atom в пользовательском рабочем каталоге?

    Можно ли изменить приоритет файла подкачки, не отключая его?

    Есть ли способ / программа для подсчета циклов разряда батареи моего ноутбука?

    Linux и Unix - лучшая ОС в мире.