Добавление значений во втором столбце, если первая запись столбца одинакова в UNIX

Я пытаюсь объединить файл, содержащий следующие данные в UNIX. Мне нужно добавить суммы, если ключ такой же.

Key,amount,date,Time abc-xyz-12234,45,15-08-91,23:00 pqr-vgh-5241,15,15-08-91,21:00 abc-xyz-12234,35,15-08-91,23:00 pqr-vgh-5241,24,15-08-91,21:00 abc-xyz-12234,655,15-08-91,23:00 lkj-erf-8542,281,15-08-91,10:00 pqr-vgh-5241,40,15-08-91,21:00 

Результат должен быть следующим:

 abc-xyz-12234,735,15-08-91,23:00 pqr-vgh-5241,79,15-08-91,21:00 lkj-erf-8542,281,15-08-91,10:00 

Я попробовал следующую команду, но это просто дает мне uniq

 cat file | grep "abc-xyz-12234" | uniq 

Может ли кто-нибудь помочь мне пройти через это?

3 Solutions collect form web for “Добавление значений во втором столбце, если первая запись столбца одинакова в UNIX”

Другим возможным решением с awk может быть:

 awk 'BEGIN { FS = OFS = "," } NR != 1 { y[$1] += $2; $2 = y[$1]; x[$1] = $0; } END { for (i in x) { print x[i]; } }' file 

Недостаток – это не сохранит ваш заказ. Таким образом, результат может быть:

 pqr-vgh-5241,79,15-08-91,21:00 abc-xyz-12234,735,15-08-91,23:00 lkj-erf-8542,281,15-08-91,10:00 

Вы можете сделать это с помощью awk:

 #!/bin/sh sort | awk -F, ' function result() { if ( key != "" ) { printf "%s,%d,%s\n", key, value, datetime; } } BEGIN { key = ""; value = 0; datetime = ""; } $2 ~ /^[0-9]+/ { if ( $1 == key ) { value += $2; } else { result(); key = $1; value = $2; datetime = $3 "," $4; } } END { result(); } ' а #!/bin/sh sort | awk -F, ' function result() { if ( key != "" ) { printf "%s,%d,%s\n", key, value, datetime; } } BEGIN { key = ""; value = 0; datetime = ""; } $2 ~ /^[0-9]+/ { if ( $1 == key ) { value += $2; } else { result(); key = $1; value = $2; datetime = $3 "," $4; } } END { result(); } ' 

дающий

 ./foo <input abc-xyz-12234,735,15-08-91,23:00 lkj-erf-8542,281,15-08-91,10:00 pqr-vgh-5241,79,15-08-91,21:00 

Вот в Perl. Назовите это как ./script file.ext :

 use warnings; use strict; my %data; my @order; while (<>){ next if $. == 1; my @line = split /,/; if (defined $data{$line[0]}){ $data{$line[0]}->[1] += $line[1]; } else { $data{$line[0]} = \@line; push @order, $line[0]; } } for (@order){ print join(',', @{$data{$_}}); } 
  • вырезать первый и последний элемент в CSV
  • Выполните вывод скрипта, который извлекает данные из CSV
  • Удалить строки из файла в зависимости от строк, найденных в другом файле
  • Как преобразовать мои текстовые файлы (каждый из которых содержит пару имени пользователя + пароль) в CSV, чтобы импортировать их в KeePass через bash (cygwin)
  • Как извлечь одно значение из однострочных кортежей?
  • CSV-копия не копирует 5 файлов из 4000+
  • Как я могу использовать несколько операторов if внутри другого if инструкции awk-программы?
  • Есть ли способ сортировать grep-вывод csv-файла?
  • CSV - сохранить только определенные записи
  • Scripting для разделения одной строки CSV на несколько
  • Как найти и заменить новую строку?
  • Как преобразовать данные с разделителями табуляции в данные с разделителями-запятыми?
  • Interesting Posts

    Как перечислить все сетевые подключения Centos 7 (отслеживание соединений)

    синтаксис синтаксиса bash и ;; терминаторы

    Как включить поддержку мыши в терминале Emacs?

    RPM: ошибка jre-зависимостей, хотя эта версия JRE установлена

    В каких сценариях я хочу установить бит SUID?

    Debian Jessie GRUB2 на многопользовательском ноутбуке EFI не может запускать ядро-initramf для Gentoo

    Как установить драйвер Nvidia на Debian 8 на MS6 ge60 gtx960m?

    Резервное копирование жестких ссылок (rsync)?

    (Кабели Ethernet): Может ли прямой провод работать (слегка), где необходим кроссовер (без MDX)?

    Возможно ли создать отредактированную копию файла без использования дополнительного дискового пространства?

    Использование if и find together

    почему linux повторно использует порт «time_wait»?

    SSH без логина и пароля

    Подключите мой ноутбук через рабочий стол к Интернету

    SonicWall NetExtender висит на подключении к туннелю

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