Chinaunix
标题:
求perl脚本帮助,文本中关于相同内容合并
[打印本页]
作者:
yang7473453
时间:
2015-09-06 18:34
标题:
求perl脚本帮助,文本中关于相同内容合并
文件一:
1###ENSMMUP00000017866###-###27582-27683
1###ENSMMUP00000017866###-###27508-27576
1###ENSMMUP00000017866###-###27290-27503
1###ENSMMUP00000017866###-###24407-24477
1###ENSMMUP00000017866###-###24345-24401
1###ENSMMUP00000017866###-###24047-24340
1###ENSMMUP00000017866###-###23770-24042
1###ENSMMUP00000017866###-###23742-23765
1###ENSMMUP00000040736###-###199515-200498
1###ENSMMUP00000040736###-###198582-198818
1###ENSMMUP00000030409###+###395728-395934
1###ENSMMUP00000030409###+###403004-403148
1###ENSMMUP00000030409###+###407674-407795
1###ENSMMUP00000030409###+###408910-409030
想合并相同的,生成文件格式如下:
1###ENSMMUP00000017866###-###27582-27683 27508-27576 27290-27503 24407-24477 24345-24401 24047-24340 23770-24042 23742-23765
1###ENSMMUP00000040736###-###199515-200498 198582-198818
1###ENSMMUP00000030409###+###395728-395934 403004-403148 407674-407795 408910-409030
作者:
MMMIX
时间:
2015-09-06 23:20
回复
1#
yang7473453
用正则把两部分抽取出来,然后放到个 hash 中,然后输出即可。
作者:
xiaoxingan99
时间:
2015-09-07 09:41
练习一下,没有排序的
use strict;
use warnings;
my $key;
my $value;
my %h;
foreach (<DATA>)
{
($key,$value)=$_=~/(.{29})(.*)/;
$h{$key}.="$value ";
}
foreach (keys %h)
{
print "$_$h{$_}\n";
}
作者:
MMMIX
时间:
2015-09-07 09:51
本帖最后由 MMMIX 于 2015-09-07 09:51 编辑
回复
3#
xiaoxingan99
foreach (<DATA>) 或者 foreach (<>) 或者 foreach (<$fh>)
这些写法不能说错,但要碰上大文件, 例如说是个两三G的文件要处理, 这种写法由于要预先把文件整个读入, 直接就能把机器拖到不可用.
正确的写法应该是 while (<>)
作者:
xiaoxingan99
时间:
2015-09-07 09:53
回复
4#
MMMIX
谢谢指教^_^
作者:
yang7473453
时间:
2015-09-07 23:32
非常感谢,不过可以解释一下这个~/(.{29})(.*)/是什么意思,尤其是29这个不太懂
回复
3#
xiaoxingan99
作者:
xiaoxingan99
时间:
2015-09-08 09:05
回复
6#
yang7473453
这段是匹配,.是元字符,这里表示除了回车外的所有单字符,{29}表示匹配29次
我是按照你给的数据, 数出来后面应该是第29位开始是要处理的数据
这个匹配是最简单的,你看一下平perl语言入门第七章就知道了
作者:
yang7473453
时间:
2015-09-08 11:05
非常感谢!!!
回复
7#
xiaoxingan99
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2