免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: yj11
打印 上一主题 下一主题

怎么把相同行数合并到一行,然后原行数后面的数字相加 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2010-01-08 10:10 |只看该作者
原帖由 linuxty 于 2010-1-8 10:01 发表
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] 就是一个哈希数组, 以$F[0]为key,$F[1 ...


这是命令行的写法,如果写成程序是如何写?我不是很明白每行的第一列是如何赋值给$F[0],第二列是如何赋值给$f[1]的,这个在程序里面是如何写的。

论坛徽章:
0
12 [报告]
发表于 2010-01-08 10:21 |只看该作者
谢谢各位帮助。虽然还有不明白的地方,我自己再找找文档查一下。

论坛徽章:
1
狮子座
日期:2013-12-16 16:09:24
13 [报告]
发表于 2010-01-08 11:17 |只看该作者
原帖由 mwm5 于 2010-1-8 09:16 发表
perl -anle '$cnt{$F[0]}+=$F[1];END{print "$_\t$cnt{$_}" for keys %cnt}' urfile


END太好用了!!!

论坛徽章:
0
14 [报告]
发表于 2010-01-08 14:50 |只看该作者
原帖由 yj11 于 2010-1-8 10:10 发表


这是命令行的写法,如果写成程序是如何写?我不是很明白每行的第一列是如何赋值给$F[0],第二列是如何赋值给$f[1]的,这个在程序里面是如何写的。



我想这个应该跟-a有关系,默认把split后的值放入数组@F里

论坛徽章:
0
15 [报告]
发表于 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代表整行内容

论坛徽章:
0
16 [报告]
发表于 2010-01-08 15:19 |只看该作者

回复 #1 yj11 的帖子

第二部分:命令行Perl参数:可以让短小的Perl程序运行在命令行.

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

多个 -e 也可以同时使用, 运行顺序根据它出现的位置.
$ perl -e 'print "Hello ";' -e 'print "World\n"'
象所有的 Perl 程序一样, 只有程序的最后一行不需要以 ; 结尾.

2:-M
可以象通常一样引用模
$ perl -MLWP::Simple -e 'getstore ("http://www.163.com/","163.html"'##下载整个网页
-M+模块名 和 use模块名一样

3:-n
增加了循环的功能, 使你可以一行一行来处理文件
$  perl -n -e'print;' 1.txt #####$  perl -ne 'print;' 1.txt
这与下面的程序一样.
LINE:
    while (<> {

     print;
    }

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

上面的这一行可以写成
  LINE:

    while (<> {

      print "$. - $_"

    }
输出当前行数 $. 和当前行 $_.

4:-p ,和 -n 一样,但是还会打印 $_ 的内容




如果想在循环的前后做些处理, 可以使用 BEGIN 或 END block. 下面的这一行计算文件里的字数.

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

每一行所有匹配的字放入数组 @w , 然后把 @w 的元素数目递加到  $t. END block 里的 print 最后输出文件总字数.
还有两个参数可以让这个程序变得更简单.

5:-a
打开自动分离 (split)模式. 空格是缺省的分离号. 输入根据分离号被分离然后放入缺省数组@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 参数, 用来给每一个输出加 \n. 例如
$ perl -le 'print "Hello World"'

论坛徽章:
0
17 [报告]
发表于 2010-01-08 16:00 |只看该作者
perl -lane '$a{$F[0]}+=$F[1];END{print $_," ",$a{$_} for keys %a}' file

论坛徽章:
0
18 [报告]
发表于 2010-01-08 17:44 |只看该作者
不擅长命令···因为不再linux下用perl···
不过用hash很容易解决这个问题··

[ 本帖最后由 wfnh 于 2010-1-8 17:45 编辑 ]

论坛徽章:
0
19 [报告]
发表于 2010-01-08 18:02 |只看该作者

回复 #18 wfnh 的帖子

感觉perl的命令行很好用,而且其实也很简单~
和awk还有sed有很多相通的地方,而且完全可以取代那2个
另外就是我初学perl,感觉有的时候遇到疑问了,用perl命令行测试结果很方便的~

论坛徽章:
0
20 [报告]
发表于 2010-01-08 20:50 |只看该作者
原帖由 mwm5 于 2010-1-8 18:02 发表
感觉perl的命令行很好用,而且其实也很简单~
和awk还有sed有很多相通的地方,而且完全可以取代那2个
另外就是我初学perl,感觉有的时候遇到疑问了,用perl命令行测试结果很方便的~


因为是环境的问题吧···linux下·命令行很容易··win下··觉得怪怪的···所以··
我一直都是写脚本···哪怕是一行代码···呵呵··
不过··也用过命令行····确实是很方便··
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP