首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于隐式循环一行的Perl累加器数组?(通过和执行类似sql的组)

用于隐式循环一行的Perl累加器数组?(通过和执行类似sql的组)
EN

Stack Overflow用户
提问于 2016-10-04 00:55:30
回答 2查看 259关注 0票数 2

我想对以下数据进行汇总,按月分组(我的亚马逊支出按月汇总):

投入:

代码语言:javascript
复制
2016-08     $5
2016-08     $10
2016-09     $7
2016-09     $6
2016-10     $7
2016-10     $5

产出:

代码语言:javascript
复制
2016-08     $15
2016-09     $13
2016-10     $12

我在网上看到了很多丑陋的解决方案。我希望像使用regex替换那样使用perl -pe语法(即隐式循环)。

可以这样做吗?也许可以使用一个“隐式变量”,即数组?

我想这个命令应该是这样的:

代码语言:javascript
复制
cat mydata.csv | perl -pe 's{(.*)\s*(.*)}{dict[$1] = $1 , dict[$1] += $2 }ge END { print @dict}'

答案

记住,在非严格模式下,您不需要声明任何变量,包括数组。您可以使用它们,正如公认的答案所指示的那样。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-04 01:45:05

您可以使用Perl的方式与使用AWK的方式相同,并引用@F中的字段。

代码语言:javascript
复制
perl -alne '$F[1]=~tr/$//d; $tot{$F[0]} += $F[1];
   END { for $d (sort keys %tot) { print "$d\t\$$tot{$d}" } }' mydata.csv

请注意,您必须处理美元符号,两者都去掉它的一个加法它回来。

票数 5
EN

Stack Overflow用户

发布于 2016-10-04 01:14:07

-n-p选项围绕整个程序包装了一个while (<>) { ... },但是我们并不真正希望它围绕整个程序,所以我们需要自己重新创建它(连同-a仿真):

代码语言:javascript
复制
$ perl -WE 'while (<>) { @F = split; $F[1] =~ s/\$//; $H{$F[0]} += $F[1]; } say "$_ \$$H{$_}" for sort(keys(%H))' data.txt

输出:

代码语言:javascript
复制
2016-08 $15
2016-09 $13
2016-10 $12
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39842665

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档