免费注册 查看新帖 |

Chinaunix

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

请教perl高手 [复制链接]

论坛徽章:
5
丑牛
日期:2014-01-21 08:26:26卯兔
日期:2014-03-11 06:37:43天秤座
日期:2014-03-25 08:52:52寅虎
日期:2014-04-19 11:39:48午马
日期:2014-08-06 03:56:58
11 [报告]
发表于 2014-06-17 14:06 |只看该作者
偶试试...
for windows only
  1. use 5.018;

  2. open my $f1, 'file1.txt';
  3. open my $f2, 'file2.txt';

  4. my $title = join "\t", split( /\s+/, <$f1> ), ( split /\s+/, <$f2> )[ 4 .. 9 ];
  5. say $title;
  6. my @head = (0) x 12;
  7. my @tail = (0) x 6;
  8. my %f;

  9. while (<$f1>) {
  10.     chomp;
  11.     my @a = split /\t/;
  12.     push @{ $f{"@a[ 0 .. 3 ]"} }, @a;
  13. }

  14. while (<$f2>) {
  15.     chomp;
  16.     my @a   = split /\t/;
  17.     my $key = "@a[ 0 .. 3 ]";
  18.     exists $f{$key}
  19.       ? push @{ $f{$key} }, @a[ 4 .. $#a ]
  20.       : push @{ $f{$key} }, @a[ 0 .. 3 ], @head, @a[ 4 .. $#a ];
  21. }

  22. say join "\t", @{ $f{$_} }, @{ $f{$_} } > 16 ? () : @tail
  23.   for sort { $f{$a}[0] cmp $f{$b}[0] || $f{$a}[1] <=> $f{$b}[1] } keys %f;

复制代码
回复 1# owwa


   

论坛徽章:
0
12 [报告]
发表于 2014-06-17 17:57 |只看该作者
回复 11# pitonas

多谢兄弟,由于文件较大,最好ubuntu中应用。

论坛徽章:
5
丑牛
日期:2014-01-21 08:26:26卯兔
日期:2014-03-11 06:37:43天秤座
日期:2014-03-25 08:52:52寅虎
日期:2014-04-19 11:39:48午马
日期:2014-08-06 03:56:58
13 [报告]
发表于 2014-06-17 19:41 |只看该作者
{:2_172:} ok:
请确保您的文件格式是
unix 格式 "\n"
不是
windows 格式 "\r\n"
  1. #!/usr/bin/perl

  2. open my $f1, 'file1.txt';
  3. open my $f2, 'file2.txt';

  4. chomp( my $t1 = <$f1> );
  5. my $t2 = ( split /\t/, <$f2>, 5 )[-1];
  6. print join "\t", $t1, $t2;

  7. my $head = join "\t", (0) x 12;
  8. my $tail = join( "\t", (0) x 6 ) . $/;
  9. my %f;

  10. while (<$f1>) {
  11.     chomp;
  12.     my @a = split /\t/, $_, 5;
  13.     $f{ join "\t", @a[ 0 .. 3 ] } = [ @a[ 0, 1 ], $a[4] ];
  14. }

  15. while (<$f2>) {
  16.     my @a = split /\t/, $_, 5;
  17.     my $key = join "\t", @a[ 0 .. 3 ];
  18.     exists $f{$key}
  19.       ? push @{ $f{$key} }, $a[4]
  20.       : push @{ $f{$key} }, @a[ 0, 1 ], $head, $a[4];
  21. }

  22. print join "\t", $_, $f{$_}[2], @{ $f{$_} } == 4 ? $f{$_}[3] : $tail
  23.   for sort { $f{$a}[0] cmp $f{$b}[0] || $f{$a}[1] <=> $f{$b}[1] } keys %f;

复制代码
回复 12# owwa


   

论坛徽章:
0
14 [报告]
发表于 2014-06-17 20:48 |只看该作者
回复 13# pitonas

多谢兄弟的帮助!其实文件file1和file2的列数是不固定的,file1还可能有g,h等列,file2还可能有r,s等列,但1-4列是固定的。
   

论坛徽章:
5
丑牛
日期:2014-01-21 08:26:26卯兔
日期:2014-03-11 06:37:43天秤座
日期:2014-03-25 08:52:52寅虎
日期:2014-04-19 11:39:48午马
日期:2014-08-06 03:56:58
15 [报告]
发表于 2014-06-18 14:13 |只看该作者
{:2_179:} 这个问题比较难, 很难搞

请确保您的 file1.txt, file2.txt 文件格式
是 unix 格式 "\n"
不是 windows 格式 "\r\n"


perl script.pl file1.txt file2.txt > new.txt
  1. #!/usr/bin/perl

  2. open my $f1, $ARGV[0];
  3. open my $f2, $ARGV[1];

  4. my $title1 = <$f1>;
  5. my $title2 = ( split /\t/, <$f2>, 5 )[-1];
  6. my $col1   = ( $title1 =~ tr/\t// ) + 1 - 4;
  7. my $col2   = ( $title2 =~ tr/\t// ) + 1;
  8. my $void1  = join( "\t", (0) x $col1 );
  9. my $void2  = join( "\t", (0) x $col2 ) . $/;

  10. chomp $title1;
  11. print join "\t", $title1, $title2;
  12. my %f;

  13. while (<$f1>) {
  14.     chomp;
  15.     my @a = split /\t/, $_, 5;
  16.     $f{ $a[0] }{ join "\t", @a[ 1 .. 3 ] } = [ @a[ 1, -1 ] ];
  17. }

  18. while (<$f2>) {
  19.     my @a = split /\t/, $_, 5;
  20.     my $key = join "\t", @a[ 1 .. 3 ];
  21.     exists $f{ $a[0] }{$key}
  22.       ? push @{ $f{ $a[0] }{$key} }, $a[-1]
  23.       : push @{ $f{ $a[0] }{$key} }, $a[1], $void1, $a[-1];
  24. }

  25. my @chrom = map { $_->[0] } sort { $a->[1] <=> $b->[1] }
  26.   map { [ $_, substr $_, 3 ] } keys %f;

  27. for my $chr (@chrom) {
  28.     print "$chr\t$_\t$f{$chr}{$_}[1]\t", $f{$chr}{$_}[2] || $void2
  29.       for sort { $f{$chr}{$a}[0] <=> $f{$chr}{$b}[0] }
  30.         keys %{ $f{$chr} };
  31. }

复制代码
回复 14# owwa


   

论坛徽章:
8
技术图书徽章
日期:2013-08-22 11:21:28未羊
日期:2015-01-19 22:22:25巳蛇
日期:2014-08-11 16:53:08子鼠
日期:2014-05-29 09:04:44摩羯座
日期:2014-04-11 14:15:07丑牛
日期:2014-01-24 12:41:28金牛座
日期:2013-11-21 17:38:28射手座
日期:2015-01-21 08:50:32
16 [报告]
发表于 2014-06-18 14:29 |只看该作者
回复 15# pitonas


    我是来膜拜大神的~mark帖~

论坛徽章:
0
17 [报告]
发表于 2014-06-18 17:17 |只看该作者
回复 15# pitonas

非常非常感谢!

   

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
18 [报告]
发表于 2014-06-19 14:31 |只看该作者
我也来一发~{:2_172:}
  1. #!/usr/bin/perl
  2. open F1, 'a' or die;
  3. open F2, 'b' or die;

  4. my $t1 = <F1>;
  5. my $t2 = <F2>;
  6. my $str1 = join "\t", (0) x ( ( $t1 =~ s/\t/\t/g ) - 3 );
  7. my $str2 = join "\t", (0) x ( ( $t2 =~ s/\t/\t/g ) - 3 );
  8. $t2 =~ s/(\S+\t){4}//;
  9. $t1 =~ s/\n/\t$t2/;
  10. print $t1;

  11. chomp ( my @f1 = <F1> );
  12. chomp ( my @f2 = <F2> );

  13. my ( %h1, %h2 );

  14. map { $f1[$_] =~ s/((\S+\t){4})//; $h1{$1} = $f1[$_] } 0..$#f1;
  15. map { $f2[$_] =~ s/((\S+\t){4})//; $h2{$1} = $f2[$_] } 0..$#f2;

  16. exists $h2{$_} ? push @result, "$_$h1{$_}\t$h2{$_}$/" : push @result, "$_$h1{$_}\t$str2$/" for keys %h1;
  17. exists $h1{$_} || push @result, "$_$str1\t$h2{$_}$/" for keys %h2;

  18. map { print $_->[1] } sort { $a->[0] <=> $b->[0] } map { [ (split)[1], $_ ] } @result;
复制代码

论坛徽章:
0
19 [报告]
发表于 2014-06-20 08:12 |只看该作者
回复 18# yestreenstars

谢谢兄弟!
   

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
20 [报告]
发表于 2014-06-20 09:00 |只看该作者
回复 19# owwa
我将你的帖子转到Shell版了,楼主有空的话可以去看看,比较一下awk和perl的效率~{:2_168:}
http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=4142697&fromuid=26669282
   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP