17

次のテキストファイルがあります。

ABC 50
DEF 70
XYZ 20
DEF 100
MNP 60
ABC 30

個々の値を合計して結果として表示する出力が必要です。たとえば、ファイル内のすべての ABC 値の合計は (50 + 30 = 80) であり、DEF は (100 + 70 = 170) です。したがって、出力はすべての一意の最初の列名を次のように合計する必要があります-

ABC 80
DEF 170
XYZ 20
MNP 60

どんな助けでも大歓迎です。

ありがとう

4

5 に答える 5

16
$ awk '{a[$1]+=$2}END{for(i in a) print i,a[i]}' file
ABC 80
XYZ 20
MNP 60
DEF 170
于 2010-02-22T14:13:53.457 に答える
5

awk '{sums[$1] += $2} END { for (i in sums) printf("%s %s\n", i, sums[i])}' input_file | sort

結果をアルファベット順にソートする必要がない場合は、その| sort部分を削除してください。

于 2010-02-22T13:55:31.863 に答える
5
$ perl -lane \
    '$sum{$F[0]} += $F[1];
     END { print "$_ $sum{$_}"
             for sort grep length, keys %sum }' \
    input
ABC 80
DEF 170
MNP 60
XYZ 20
于 2010-02-22T14:57:56.753 に答える
2
perl -lane '$_{$F[0]}+=$F[1]}print"$_ $_{$_}"for keys%_;{' file

そして、少し簡単ではありません:

perl -ape '$_{$F[0]}+=$F[1]}map$\.="$_ $_{$_}\n",keys%_;{' file
于 2010-02-22T15:55:37.617 に答える
1
my %data;
while (<>) {
    if (my ($key, $value) = /^(\w+) \s* (\d+)$/x) {
        $data{$key} += $value;
    }
}
printf "%s %s\n", $_, $data{$_} for keys %data;
于 2010-02-22T13:59:29.130 に答える