첫 번째 열의 항목이 UNIX에서 동일하면 두 번째 열의 값을 추가하십시오.

첫 번째 열의 항목이 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

답변1

또 다른 가능한 해결책은 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

답변2

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(); }
'

주다

./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

답변3

이것은 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{$_}});
}

답변4

이는 Miller()를 사용하여 및 필드로 그룹화된 각 레코드 집합에 대한 필드 합계를 계산합니다 mlr. Miller는 합계를 필드 목록 끝에 새 필드로 추가하므로 필드 순서를 변경하고 레이블도 다시 지정합니다.amountKeydateTimeamount_sum

mlr --csv \
    stats1 -a sum -f amount -g Key,date,Time then \
    reorder -f Key,amount_sum then \
    label Key,amount file

질문의 데이터 출력을 제공합니다.

Key,amount,date,Time
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

출력에 헤더를 포함하지 않으려면 mlr해당 옵션과 함께 사용하십시오 --headerless-csv-output.

관련 정보