http://blog.sina.com.cn/s/blog_4af3f0d20100g9oz.html
aaa@domain.com 2
aaa@domain.com
111
bbb@home.com 2222
bbb@home.com 1
类似这种输出,我想把他们变换成下面形式:
aaa@domain.com
113
bbb@home.com
2223
就是将相同邮箱名称后面的数字相加。各位大侠能否给些思路如何用perl来实现。
答案:
perl
-anle ‘$cnt{$F[0]}+=$F[1];END{print "$_\t$cnt{$_}" for keys %cnt}‘
urfile
如果熟悉了上面几个perl命令行参数的用法,上面的这个命令应该很好理解:
每次读取urfile的一行,由于使用了-a,打开自动分离
(split)模式. 空格是缺省的分离号.
输入根据分离号被分离然后放入缺省数组@F中,
以文件的第一行为例子$F[0]
就是 aaa@domain.com , $F[1] 就是2
$cnt{$F[0]}
+=$F[1] 就是一个哈希数组,
以$F[0]为key,$F[1]为value,把相同key的数值都叠加起来.然后把文件的每一行都这样处理一次.
END{}
就是在循环完之后再处理.里面的意思就是打印这个%cnt 哈希数组.这个哈希数组的key就是
邮箱名称,value就是叠加后的数字.
下面的是上面行命令的文本形式:
#!/usr/bin/perl
use
strict;
use warnings;
my
%hash;
while
(<>){
chomp;
my
@array=split;
$hash{$array[0]}
+=$array[1];
}
END{
foreach
(keys
%hash){
print"$_\t$hash{$_}\n";
}
}
原文地址:http://www.cnblogs.com/hurner/p/3768371.html