免费注册 查看新帖 |

Chinaunix

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

刚入门perl新手求助:如何提取相同文件名的数据行并存入相应文件~~ [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-10-11 23:20 |只看该作者 |倒序浏览
本帖最后由 linghu002127 于 2011-10-11 23:26 编辑

各位,一位刚入门的perl新手求助:
现在我手上有一组这样的数据(很大,格式如下),数据之间用tab键分开
chr10 42963917 42963941 U0 -
chr4 70445617 70445641 U0 +
chr2 156399713 156399737 U0 -
chr4 77168812 77168836 U0 -
chr2 229229269 229229293 U0 +
chr3 137227198 137227222 U0 +
chrX 131453155 131453179 U0 +
chr2 203485084 203485108 U0 -
.............



需要处理为:

1) 在第四和第五列之间加一个字符"0",依然用tab键将他们分开,如下

chr10 42963917 42963941 U0 0 -
chr4 70445617 70445641 U0 0 +
chr2 156399713 156399737 U0 0 -
chr4 77168812 77168836 U0 0 -
chr2 229229269 229229293 U0 0 +
chr3 137227198 137227222 U0 0 +
chrX 131453155 131453179 U0 0 +
chr2 203485084 203485108 U0 0 -
................

这一步我解决,代码附后。

2)
将第一列中文件名相同的行都存入同一个文件,例如:

chr1.txt
chr1 156399713 156399737 U0 0 -
chr1 136635413 134539976 U0 0 +
.......

chr2.txt
chr2 229229269 229229293 U0 0 +
chr2 203485084 203485108 U0 0 -
.......

............
一直到
chr22.txt
chr22 229229269 229229293 U0 0 +
chr22 203485084 203485108 U0 0 -
.......

chrx.txt
chrx 229229269 229229293 U0 0 +
chrx 203485084 203485108 U0 0 -
.......

chry.txt
chry 229229269 229229293 U0 0 +
chry 203485084 203485108 U0 0 -
.......

一共24个文件。
求帮忙解决一下。我刚接触perl,希望各位见谅,拍我砖都行,看了快一天的perl了,还是解决不了~~ 呜呜~~

论坛徽章:
0
2 [报告]
发表于 2011-10-11 23:22 |只看该作者
本帖最后由 linghu002127 于 2011-10-11 23:25 编辑

这是我问题1的perl程序,方法很笨,但是实现了。
求助问题2的解决办法,能贴出源程序最好,不方便给点提示也可以~~
再次谢谢了~~
  1. #!/usr/bin/perl

  2. use strict;
  3. use warnings;

  4. open (MYFILE1,'D:\data\CD4-H3K9ac.bed') or die '$!';     #导入文件
  5. open (OUT1,'+>D:\data\CD4-H3K9ac1.bed');                 #导出文件

  6. while(<MYFILE1>)
  7. {
  8.    chomp;   
  9.    my @items = split("\t",$_);        
  10.    my $a=join("\t",$items[0],$items[1],$items[2],$items[3]);   
  11.    my $str=$a."  0  ".$items[4];   #用"."连接操作符将他们组合起来
  12.    print OUT1 "$str\n";  
  13. }

  14. close MYFILE1;
  15. close OUT1;
复制代码
输出结果:
chr10 42963917 42963941 U0 0 -
chr4 70445617 70445641 U0 0 +
chr2 156399713 156399737 U0 0 -
chr4 77168812 77168836 U0 0 -
chr2 229229269 229229293 U0 0 +
chr3 137227198 137227222 U0 0 +
chrX 131453155 131453179 U0 0 +
chr2 203485084 203485108 U0 0 -
................

论坛徽章:
0
3 [报告]
发表于 2011-10-12 00:35 |只看该作者
本帖最后由 Perlvim 于 2011-10-12 00:54 编辑
  1. #!perl

  2. use strict;
  3. use warnings;
  4. use 5.010;
  5. use autodie;
  6. use List::MoreUtils qw<mesh>;

  7. open (FILE,'<', 'D:\data\CD4-H3K9ac.bed');

  8. my @num = (1 .. 22, 'x', 'y');
  9. my @fh = map { "CHR$_" } @num;
  10. my @file = map { lc($_) } @fh;
  11. my %file_fh = mesh @file, @fh;
  12. while (my ($file, $fh) = each %file_fh) {
  13.     eval("open($fh, '>', \$file);");
  14. }

  15. while(my $line = <FILE>) {
  16.     $line =~ s/([+-])$/0\t$1/;
  17.     my($file) = split /\t/, $line;
  18.     eval("say $file_fh{$file} \$line");
  19. }
  20. close FILE;
复制代码

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
4 [报告]
发表于 2011-10-12 01:02 |只看该作者
本帖最后由 yinyuemi 于 2011-10-12 01:03 编辑
  1. perl -le 'while(<>){chomp; $file=(split)[0];open ($file, ">>$file.txt");print $file $_;close($file)}'
复制代码

论坛徽章:
0
5 [报告]
发表于 2011-10-12 02:15 |只看该作者
本帖最后由 albertd 于 2011-10-15 02:30 编辑

回复 2# linghu002127


    For your question1 :

my $str=join("\t",@items[0 .. 3],"o",$item[4]);

论坛徽章:
0
6 [报告]
发表于 2011-10-12 09:46 |只看该作者
第二步:
  1. #!/usr/bin/perl
  2. use Data::Dumper;
  3. use strict;

  4. my %Data;

  5. open(INFILE,'CD4-H3K9ac1.bed');
  6. while(my $line = <INFILE>) {
  7.         push @{$Data{$1}}, $line if ($line =~ /^\s*(\S+?\s)/);
  8. }
  9. close(INFILE);

  10. foreach my $OutFileName (keys %Data) {
  11.         open(OUTFILE,">$OutFileName");
  12.         for ( my $i = 0;$i<=$#{$Data{$OutFileName}};$i++ ) {
  13.                 print OUTFILE $Data{$OutFileName}[$i];     
  14.         }
  15.         close(OUTFILE);
  16. }
复制代码

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
7 [报告]
发表于 2011-10-12 10:14 |只看该作者
第二步:
herer 发表于 2011-10-12 09:46



    13行和之后那个循环可以这样写

while (my($k, $v) = each %Data) {
    open my $out, '>', $k or die $!;
    print $out @$v;
    # 这里会自动关闭 my 声明的 $out
}

论坛徽章:
0
8 [报告]
发表于 2011-10-12 11:12 |只看该作者
回复 7# zhlong8


    谢谢!以前没想过文件句柄可以是变量

论坛徽章:
0
9 [报告]
发表于 2011-10-12 13:36 |只看该作者
谢谢楼上各位前辈无私精神~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP