最初の列のエントリがUNIXで同じ場合は、2番目の列の値を追加します。

最初の列のエントリがUNIXで同じ場合は、2番目の列の値を追加します。

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

関連情報