Добавление значений во втором столбце, если первая запись столбца одинакова в 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 

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

  • как удалить двойные кавычки в csv
  • объединить два файла csv на основе условия
  • Баш читал с разделителем прошлых строк
  • Разбор текстового файла с разделителями в bash как аргументы команды
  • Эффективный фильтр для файлов .sql с помощью только «INSERT INTO»
  • Обработка запятой в строковых значениях в файле CSV
  • Как перенаправить вывод команд Linux на конкретную строку и столбец в csv?
  • Текстовый файл процесса - Извлечь данные, начиная с номера
  • 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{$_}}); } 
    Interesting Posts

    Как я могу использовать цикл внутри команды?

    Как обеспечить пароль безопасным способом для семени LDAP?

    Организация беспорядочной папки на основе типа файла

    Прикрепление файла в Unix для данной строки, а затем другой набор строк в этом файле и печать свойств файла тоже

    Как передать переменную в команде в UNIX?

    Как включить заполнение bash в режиме vi на Synology DSM6

    Что именно происходит, когда я запускаю файл в своей оболочке?

    Что значит, что дистрибутив «основан на» другом дистрибутиве?

    при запуске `udevadm test`:` no db file to read / run / udev / data / + gpio_sw: PA7: Нет такого файла или каталога`

    Как показать текущее значение переменной среды?

    находить измененные файлы рекурсивно и копировать с каталогом, сохраняющей структуру каталогов

    Предотвращение отключения терминала от убийства текущей работы в zsh

    Является ли их «свободным от трения» способ конвертировать RAID1 в RAID5?

    Как использовать команду setarch uname в сценарии оболочки

    SSH в локальной сети при хостинге одной сети

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