免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2128 | 回复: 7
打印 上一主题 下一主题

帮忙看看这个程序 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-02-08 10:49 |只看该作者 |倒序浏览
我有一个文件$file,基本内容是这样的:

aa bb
cc dd
ee ff
bb gg
hh ii
jj aa
kk dd
cc ff
...

每一行都有2个元素,然后我要把有相同元素的行取出来放在一个新的文件里,如
新文件一:
aa bb
bb gg
jj aa

新文件二:
cc dd
kk dd
cc ff
ee ff

也就是说只要每一行有一个元素相同,就把它们放在一个新的文件里,每一行被归入一个新的文件后,就不需要再重复归入别的文件,也就是说每一行处理一次就行了。

现在我写下来的问题是,知道怎么把相同的行放在一个新的文件里,但是每一行都会被处理很多次,有很多的重复文件生成,请高手指教一下

论坛徽章:
0
2 [报告]
发表于 2008-02-09 22:10 |只看该作者
有没有高手帮帮忙,或者给个思路也行

我现在用现有的知识无法解决,只能手动

以第一行为例,先在整个文本里面搜aa,得到
aa bb
jj aa

然后在整个文本里面搜bb,得到
aa bb
jj aa
bb gg

然后在整个文本里面搜jj,如果有jj,就打印到下面

然后在整个文本里面搜gg,如果有gg,就打印到下面

...

一直这样,直到这样的行全部被搜到为止

我想用hash变量对应于每行的两个元素,但是在键和值中都有重复,不知道该怎么处理了,请大家帮忙了,急用,谢谢拉

或者有什么其它的工具也行,谢谢拉

[ 本帖最后由 duziteng 于 2008-2-9 22:12 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2008-02-10 12:22 |只看该作者
大体看懂了你的意思
手头没有类unix的环境
所以只能讲讲我的思路,一家之言
hash的key还是用行号来做好了,value则用一个匿名list
行号可以用$.变量(印象中是这个变量)获得,或者你可以从1开始,读一行加一个
读取的过程可以用下面的代码(没有测试过)

  1. my %hash;
  2. while(<$file>){
  3. $hash{$.}= split;
  4. }
复制代码

论坛徽章:
0
4 [报告]
发表于 2008-02-11 10:49 |只看该作者
谢谢,我还是入门级的新手,请问你的意思是:用行号作key,value是包括两个字串的数组?
这个hash应该怎么写

[ 本帖最后由 duziteng 于 2008-2-11 10:51 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2008-02-11 16:48 |只看该作者
my %hash;
while(<$file>){
$hash{$.}= split;
}
如何把每一行的数组存入hash变量的value中

论坛徽章:
0
6 [报告]
发表于 2008-02-13 16:03 |只看该作者
原帖由 duziteng 于 2008-2-11 10:49 发表
谢谢,我还是入门级的新手,请问你的意思是:用行号作key,value是包括两个字串的数组?
这个hash应该怎么写

you are right
split默认对$_进行操作,返回一个list给hash作为value
我以前只在书上看到过,没有实践过
过几天回校我我再实验下

论坛徽章:
0
7 [报告]
发表于 2008-02-14 22:02 |只看该作者
ms我讲错了
又挂在context上面了
$hash{$_} = split;
左边是一个scalar的context

可以用下面的代码


  1. #!/usr/bin/perl
  2. #===============================================================================
  3. #
  4. #         FILE:  readin.pl
  5. #
  6. #        USAGE:  ./readin.pl
  7. #
  8. #  DESCRIPTION:  hash
  9. #
  10. #      OPTIONS:  ---
  11. # REQUIREMENTS:  ---
  12. #         BUGS:  ---
  13. #        NOTES:  ---
  14. #       AUTHOR:  Leenux (Mr), <[email]firefoxelectric@gmail.com[/email]>
  15. #      COMPANY:  Debian GNU/Linux
  16. #      VERSION:  1.0
  17. #      CREATED:  02/14/2008 09:52:10 PM CST
  18. #     REVISION:  ---
  19. #===============================================================================

  20. use strict;
  21. use warnings;
  22. my %hash;
  23. open my $file, "<", "data" or die "fail to open $!";
  24. while (<$file>) {
  25.     my @tmp = split;
  26.     $hash{$.} = \@tmp;
  27. }
  28. foreach ( sort keys %hash ) {
  29.     print "$_ value one: $hash{$_}->[0]\n";
  30.     print "$_ value two: $hash{$_}->[1]\n";
  31. }
复制代码


运行结果
kernel@fairland:~/chinaunix$ cat data
bb cc
ee ff

kernel@fairland:~/chinaunix$ ./readin.pl
1 value one: bb
1 value two: cc
2 value one: ee
2 value two: ff

论坛徽章:
0
8 [报告]
发表于 2008-02-21 10:37 |只看该作者
试试这个
while(<>){
  $_ = /(\S+)/;
  print "$1\n";
}
剩下的自己想吧,呵呵
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP