http://blog.sina.com.cn/s/blog_4af3f0d20100g9oz.htmlhtml
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";
}
}dom