亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

Chinaunix

標題: 怎么把相同行數(shù)合并到一行,然后原行數(shù)后面的數(shù)字相加 [打印本頁]

作者: yj11    時間: 2010-01-08 08:55
標題: 怎么把相同行數(shù)合并到一行,然后原行數(shù)后面的數(shù)字相加
遇到一問題:
aaa@domain.com  2
aaa@domain.com 111
bbb@home.com   2222
bbb@home.com   1


類似這種輸出,我想把他們變換成下面形式:

aaa@domain.com 113
bbb@home.com 2223
就是將相同郵箱名稱后面的數(shù)字相加。各位大俠能否給些思路如何用perl來實現(xiàn)。
作者: yybmsrs    時間: 2010-01-08 09:06
標題: 回復 #1 yj11 的帖子
用hash可以吧
作者: linuxty    時間: 2010-01-08 09:10
標題: 回復 #1 yj11 的帖子
perl -nle'@x=split;$y{$x[0]}+=$x[1];}{ print "$_ $y{$_}" for keys %y'   filename
作者: mwm5    時間: 2010-01-08 09:16
標題: 回復 #1 yj11 的帖子
perl -anle '$cnt{$F[0]}+=$F[1];END{print "$_\t$cnt{$_}" for keys %cnt}' urfile
作者: mwm5    時間: 2010-01-08 09:24
標題: 回復 #3 linuxty 的帖子
學習~~
作者: yj11    時間: 2010-01-08 09:35
原帖由 linuxty 于 2010-1-8 09:10 發(fā)表
perl -nle'@x=split;$y{$x[0]}+=$x[1];}{ print "$_ $y{$_}" for keys %y'   filename


強人,感謝,感謝。
作者: linuxty    時間: 2010-01-08 09:44
標題: 回復 #6 yj11 的帖子
4樓更好 我忘了用 -a   這個方便多了
作者: yj11    時間: 2010-01-08 09:47
都是高手,能否解釋一下這語命令的含義嗎?
作者: linuxty    時間: 2010-01-08 10:01
標題: 回復 #8 yj11 的帖子
perl -anle '$cnt{$F[0]}+=$F[1];END{print "$_\t$cnt{$_}" for keys %cnt}' urfile

以第一行為例吧
$F[0] 就是 aaa@domain.com , $F[1] 就是2
$cnt{$F[0]} +=$F[1] 就是一個哈希數(shù)組, 以$F[0]為key,$F[1]為value,把相同key的數(shù)值都疊加起來.然后把文件的每一行都這樣處理一次.
END{} 就是在循環(huán)完之后再處理.里面的意思就是打印這個%cnt 哈希數(shù)組.這個哈希數(shù)組的key就是 郵箱名稱,value就是疊加后的數(shù)字.

[ 本帖最后由 linuxty 于 2010-1-8 10:04 編輯 ]
作者: cxfcxf    時間: 2010-01-08 10:06

  1. my %hash
  2. foreach (<>) {
  3.     my array = split;
  4.     $hash{$array[0]} += $array[1];
  5. }

  6. foreach (keys %hash) {
  7.     print "$_\thash{$_}";
  8. }
復制代碼

類似這個的簡化版
作者: yj11    時間: 2010-01-08 10:10
原帖由 linuxty 于 2010-1-8 10:01 發(fā)表
perl -anle '$cnt{$F[0]}+=$F[1];END{print "$_\t$cnt{$_}" for keys %cnt}' urfile

以第一行為例吧
$F[0] 就是 aaa@domain.com , $F[1] 就是2
$cnt{$F[0]} +=$F[1] 就是一個哈希數(shù)組, 以$F[0]為key,$F[1 ...


這是命令行的寫法,如果寫成程序是如何寫?我不是很明白每行的第一列是如何賦值給$F[0],第二列是如何賦值給$f[1]的,這個在程序里面是如何寫的。
作者: yj11    時間: 2010-01-08 10:21
謝謝各位幫助。雖然還有不明白的地方,我自己再找找文檔查一下。
作者: ttcn_cu    時間: 2010-01-08 11:17
原帖由 mwm5 于 2010-1-8 09:16 發(fā)表
perl -anle '$cnt{$F[0]}+=$F[1];END{print "$_\t$cnt{$_}" for keys %cnt}' urfile


END太好用了!!!
作者: bernana    時間: 2010-01-08 14:50
原帖由 yj11 于 2010-1-8 10:10 發(fā)表


這是命令行的寫法,如果寫成程序是如何寫?我不是很明白每行的第一列是如何賦值給$F[0],第二列是如何賦值給$f[1]的,這個在程序里面是如何寫的。



我想這個應該跟-a有關系,默認把split后的值放入數(shù)組@F里
作者: chunchengfh    時間: 2010-01-08 14:54
perl的命令行方式和awk是非常相似的:
  1. awk        '{ cnt[$1] += $2 } END { for (x in cnt) print x, cnt[x] }' file
  2. perl -anle '$cnt{$F[0]}+=$F[1]; END{for $x (keys %cnt) { print "$x\t$cnt{$x}" } }' file
復制代碼


最大的不同是,perl的域從0開始,而awk從1開始,而$0代表整行內容
作者: liuguiyou1981    時間: 2010-01-08 15:19
標題: 回復 #1 yj11 的帖子
第二部分:命令行Perl參數(shù):可以讓短小的Perl程序運行在命令行.

1:-e
可以讓Perl程序在命令行上運行.
例如, 我們可以在命令行上運行 "Hello World" 程序而不用把它寫入文件再運行.
$ perl -e 'print "Hello World\n"'

多個 -e 也可以同時使用, 運行順序根據(jù)它出現(xiàn)的位置.
$ perl -e 'print "Hello ";' -e 'print "World\n"'
象所有的 Perl 程序一樣, 只有程序的最后一行不需要以 ; 結尾.

2:-M
可以象通常一樣引用模
$ perl -MLWP::Simple -e 'getstore ("http://www.163.com/","163.html"'##下載整個網(wǎng)頁
-M+模塊名 和 use模塊名一樣

3:-n
增加了循環(huán)的功能, 使你可以一行一行來處理文件
$  perl -n -e'print;' 1.txt #####$  perl -ne 'print;' 1.txt
這與下面的程序一樣.
LINE:
    while (<> {

     print;
    }

<>; 打開命令行里的文件,一行行的讀取.每一行缺省保存在 $_
$ perl -n -e 'print "$. - $_"' file

上面的這一行可以寫成
  LINE:

    while (<> {

      print "$. - $_"

    }
輸出當前行數(shù) $. 和當前行 $_.

4:-p ,和 -n 一樣,但是還會打印 $_ 的內容




如果想在循環(huán)的前后做些處理, 可以使用 BEGIN 或 END block. 下面的這一行計算文件里的字數(shù).

$ perl -ne 'END { print $t } @w = /(\w+)/g; $t += @w' file.txt

每一行所有匹配的字放入數(shù)組 @w , 然后把 @w 的元素數(shù)目遞加到  $t. END block 里的 print 最后輸出文件總字數(shù).
還有兩個參數(shù)可以讓這個程序變得更簡單.

5:-a
打開自動分離 (split)模式. 空格是缺省的分離號. 輸入根據(jù)分離號被分離然后放入缺省數(shù)組@F

使用-a,上面的命令可以寫成這樣:
$ perl -ane 'END {print $x} $x += @F' file.txt  ##使用了-a



6:-F
把缺省的分離號改為你想要的.例如把分離號定為非字符,上面的命令可以改為:
$ perl -F'\W' -ane 'END {print $x} $x += @F' file.txt



7:-l 參數(shù), 用來給每一個輸出加 \n. 例如
$ perl -le 'print "Hello World"'
作者: zhaobin81    時間: 2010-01-08 16:00
perl -lane '$a{$F[0]}+=$F[1];END{print $_," ",$a{$_} for keys %a}' file
作者: wfnh    時間: 2010-01-08 17:44
不擅長命令···因為不再linux下用perl···
不過用hash很容易解決這個問題··

[ 本帖最后由 wfnh 于 2010-1-8 17:45 編輯 ]
作者: mwm5    時間: 2010-01-08 18:02
標題: 回復 #18 wfnh 的帖子
感覺perl的命令行很好用,而且其實也很簡單~
和awk還有sed有很多相通的地方,而且完全可以取代那2個
另外就是我初學perl,感覺有的時候遇到疑問了,用perl命令行測試結果很方便的~
作者: wfnh    時間: 2010-01-08 20:50
原帖由 mwm5 于 2010-1-8 18:02 發(fā)表
感覺perl的命令行很好用,而且其實也很簡單~
和awk還有sed有很多相通的地方,而且完全可以取代那2個
另外就是我初學perl,感覺有的時候遇到疑問了,用perl命令行測試結果很方便的~


因為是環(huán)境的問題吧···linux下·命令行很容易··win下··覺得怪怪的···所以··
我一直都是寫腳本···哪怕是一行代碼···呵呵··
不過··也用過命令行····確實是很方便··
作者: dragon23452345    時間: 2010-02-06 20:28
提示: 作者被禁止或刪除 內容自動屏蔽
作者: Perl_Er    時間: 2010-02-06 20:45
hash, 規(guī)矩一點的代碼看了舒服




歡迎光臨 Chinaunix (http://www.72891.cn/) Powered by Discuz! X3.2