如何根据另一列中的值对列中的值求和?

发布于 2024-08-22 15:28:28 字数 278 浏览 11 评论 0原文

我有一个文本文件:

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

任何帮助将不胜感激。

谢谢

I have a text file which is:

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

I want an output which sums up individual values and shows them as a result. For example, total of all ABC values in the file are (50 + 30 = 80) and DEF is (100 + 70 = 170). So the output should sum up all unique 1st column names as -

ABC 80
DEF 170
XYZ 20
MNP 60

Any help will be greatly appreciated.

Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

客…行舟 2024-08-29 15:28:28
$ awk '{a[$1]+=$2}END{for(i in a) print i,a[i]}' file
ABC 80
XYZ 20
MNP 60
DEF 170
$ awk '{a[$1]+=$2}END{for(i in a) print i,a[i]}' file
ABC 80
XYZ 20
MNP 60
DEF 170
等待我真够勒 2024-08-29 15:28:28

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

如果您不需要按字母顺序排序结果,只需删除 |排序部分。

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

if you don't need the results sorted alphabetically, just drop the | sort part.

南七夏 2024-08-29 15:28:28
$ 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
$ 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
哎呦我呸! 2024-08-29 15:28:28
perl -lane '$_{$F[0]}+=$F[1]}print"$_ $_{$_}"for keys%_;{' file

还有一点不那么简单:

perl -ape '$_{$F[0]}+=$F[1]}map$\.="$_ $_{$_}\n",keys%_;{' file
perl -lane '$_{$F[0]}+=$F[1]}print"$_ $_{$_}"for keys%_;{' file

And a little bit less straightforward:

perl -ape '$_{$F[0]}+=$F[1]}map$\.="$_ $_{$_}\n",keys%_;{' file
梦巷 2024-08-29 15:28:28
my %data;
while (<>) {
    if (my ($key, $value) = /^(\w+) \s* (\d+)$/x) {
        $data{$key} += $value;
    }
}
printf "%s %s\n", $_, $data{$_} for keys %data;
my %data;
while (<>) {
    if (my ($key, $value) = /^(\w+) \s* (\d+)$/x) {
        $data{$key} += $value;
    }
}
printf "%s %s\n", $_, $data{$_} for keys %data;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文