免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
论坛 程序设计 Shell perl
最近访问板块 发新帖
楼主: super_two
打印 上一主题 下一主题

[文本处理] perl [复制链接]

论坛徽章:
0
11 [报告]
发表于 2015-08-08 10:40 |只看该作者
这是我写的,结果不对,我并没有办法将我说的思路用perl写出来,麻烦您看看
#!/usr/bin/perl   -w
use warnings;
use strict;
use Bio::SeqIO;

my $data=$ARGV[0];

open (W,"<$data") || die $!;
    my %gene;
    while(<W>){
    chomp;
    $gene{$_}++;
}
close W;

open (M,"> $data.longest") || die $!;

my $all=Bio::SeqIO->new(-file=>"$data",-format=>'fasta');
while(my $seq=$all->next_seq){
    my $id=$seq->id;
    my $seq=$seq->seq;
     $gene{$seq}=length($seq);
push(my @length,$gene{$seq});
my @ids=split(/\|/,$id);
    my @newid=split(/\./,$id);
    foreach $a (@newid){
        if ($a){
            my @length_1 = sort{$a<=>$b}@length;
            print ">$id\n";
            print "$seq\n";
        }
        else{
            print ">$id\t";
            print "$seq\n";


        }
    }
}
close M;回复 9# MMMIX


   

论坛徽章:
0
12 [报告]
发表于 2015-08-08 11:12 |只看该作者
这是我写的,结果不对,我并没有办法将我说的思路用perl写出来,麻烦您看看
#!/usr/bin/perl   -w
use warnings;
use strict;
use Bio::SeqIO;

my $data=$ARGV[0];

open (W,"<$data") || die $!;
    my %gene;
    while(<W>){
    chomp;
    $gene{$_}++;
}
close W;

open (M,"> $data.longest") || die $!;

my $all=Bio::SeqIO->new(-file=>"$data",-format=>'fasta');
while(my $seq=$all->next_seq){
    my $id=$seq->id;
    my $seq=$seq->seq;
     $gene{$seq}=length($seq);
push(my @length,$gene{$seq});
my @ids=split(/\|/,$id);
    my @newid=split(/\./,$id);
    foreach $a (@newid){
        if ($a){
            my @length_1 = sort{$a<=>$b}@length;
            print ">$id\n";
            print "$seq\n";
        }
        else{
            print ">$id\t";
            print "$seq\n";


        }
    }
}
close M

论坛徽章:
12
2015年亚洲杯之乌兹别克斯坦
日期:2015-04-10 18:29:00狮子座
日期:2016-01-17 15:40:28处女座
日期:2016-01-16 17:36:17巨蟹座
日期:2016-01-16 17:35:48未羊
日期:2015-12-12 16:18:26青铜圣斗士
日期:2015-12-09 01:07:50IT运维版块每日发帖之星
日期:2015-12-05 06:20:00神斗士
日期:2015-12-03 23:13:59IT运维版块每日发帖之星
日期:2015-11-22 06:20:00IT运维版块每日发帖之星
日期:2015-11-08 06:20:00IT运维版块每日发帖之星
日期:2015-10-29 06:20:00IT运维版块每日发帖之星
日期:2016-06-30 06:20:00
13 [报告]
发表于 2015-08-08 11:53 |只看该作者
回复 10# 聆雨淋夜
  1. awk -F '[. ]+' '$1!=a{ml=length($3);a=$1;b[$1]=$3}$1==a{if(length($3)>ml){ml=length($3);b[$1]=$3}}END{for(i in b)print i"  "b[i]}' file
复制代码
请教下 $1!=a{}$1==a{}  这个结构是什么意思?以前还没有见过这种写法,
我自己猜想是
如果在匹配的过程中   $1如果相同的话执行==后面的表达式{},如果$1不相同的话执行!=后面的表达式
是这样理解的么?
这种用法是叫什么呢?哪里能找到相关的资料,想具体学习下,谢谢!

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
14 [报告]
发表于 2015-08-08 14:31 |只看该作者
回复 11# super_two


    其实, 你只需要逐个读取序列, 对于每个 id, 只保留最长的那个序列即可.

论坛徽章:
22
处女座
日期:2014-10-11 13:33:292015亚冠之塔什干火车头
日期:2015-07-20 19:59:042015亚冠之塔什干火车头
日期:2015-07-26 10:59:31程序设计版块每日发帖之星
日期:2015-08-05 06:20:00每日论坛发贴之星
日期:2015-08-05 06:20:00程序设计版块每日发帖之星
日期:2015-08-07 06:20:00每日论坛发贴之星
日期:2015-08-07 06:20:002015亚冠之阿尔纳斯尔
日期:2015-10-01 15:23:28白银圣斗士
日期:2015-12-07 17:17:06操作系统版块每日发帖之星
日期:2015-12-27 06:20:002015亚冠之广州富力
日期:2015-07-08 15:48:31程序设计版块每日发帖之星
日期:2015-06-11 22:20:00
15 [报告]
发表于 2015-08-08 15:23 |只看该作者
回复 13# j_cle

a是上一行的$1,$1!=a 表示当前行的$1和上一行的$1不一样了,这样就进行ml和b[$1]的初始化


   

论坛徽章:
22
处女座
日期:2014-10-11 13:33:292015亚冠之塔什干火车头
日期:2015-07-20 19:59:042015亚冠之塔什干火车头
日期:2015-07-26 10:59:31程序设计版块每日发帖之星
日期:2015-08-05 06:20:00每日论坛发贴之星
日期:2015-08-05 06:20:00程序设计版块每日发帖之星
日期:2015-08-07 06:20:00每日论坛发贴之星
日期:2015-08-07 06:20:002015亚冠之阿尔纳斯尔
日期:2015-10-01 15:23:28白银圣斗士
日期:2015-12-07 17:17:06操作系统版块每日发帖之星
日期:2015-12-27 06:20:002015亚冠之广州富力
日期:2015-07-08 15:48:31程序设计版块每日发帖之星
日期:2015-06-11 22:20:00
16 [报告]
发表于 2015-08-08 15:25 |只看该作者
回复 13# j_cle
其实不需要这么区分的,见CU的大神写过类似的,只是我想不起来怎么写的了。


   

论坛徽章:
0
17 [报告]
发表于 2015-08-08 17:49 |只看该作者
您可以写一个脚本让我看一下整个语法过程吗?见过的脚本太少,无法把握整体的语法结构 回复 15# 聆雨淋夜


   

论坛徽章:
0
18 [报告]
发表于 2015-08-08 18:54 |只看该作者
您可以写一个脚本让我看一下整个语法过程吗?见过的脚本太少,无法把握整体的语法结构回复 14# MMMIX


   

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
19 [报告]
发表于 2015-08-08 19:19 |只看该作者
本帖最后由 MMMIX 于 2015-08-08 21:20 编辑

回复 18# super_two


    真心建议你找些 Perl 编程的书好好看看, 不过估计你是听不进去的.

无论如何, 下述脚本演示了解决你的问题的一种方法. 另外,如果在你的输入文件中,id相同的序列顺序出现,那么也可以不用hash.

  1. use strict;
  2. use warnings;

  3. use v5.14;

  4. my %record;
  5. while (<DATA>) {
  6.     my @f = split;
  7.     $f[0] =~ s/(?:\.\d*)?$//;
  8.     if (! $record{$f[0]} || $record{$f[0]}->[0] < length($f[1])) {
  9.         $record{$f[0]} = [length $f[1], $f[1]];
  10.     }
  11. }

  12. say "output version 1:";
  13. while (my ($id, $seq) = each %record) {
  14.     say "$id\t", $seq->[1];
  15. }

  16. say "output version 2:";
  17. for my $id (sort keys %record) {
  18.     printf "%-12s %s\n", $id, $record{$id}->[1];
  19. }

  20. __DATA__
  21. qwer.1         AFRTYUIFGHJKLVBNM
  22. qwer.2         BVXNVFGSFYEBCSHB
  23. qwer.3         HDFKSHFGSERYFIEURHFSUFDSHVBSJEUABFUHABFCAHFBC
  24. rtyuip00.1    AFHBVSFHUACFKUSHDBAKFHAKUFHSADKFUA
  25. hhjkl.1         JDNVKHFBAKHFAKFAFJNSADFJAS
  26. hhjk.2         HFSDHNFKANFAKFIJI
  27. hhjk.3         JNFAJNFALSDFLMAD
  28. hhjk.4         KJGSEGJOAKFFDSMFAPOKEF
复制代码

论坛徽章:
22
处女座
日期:2014-10-11 13:33:292015亚冠之塔什干火车头
日期:2015-07-20 19:59:042015亚冠之塔什干火车头
日期:2015-07-26 10:59:31程序设计版块每日发帖之星
日期:2015-08-05 06:20:00每日论坛发贴之星
日期:2015-08-05 06:20:00程序设计版块每日发帖之星
日期:2015-08-07 06:20:00每日论坛发贴之星
日期:2015-08-07 06:20:002015亚冠之阿尔纳斯尔
日期:2015-10-01 15:23:28白银圣斗士
日期:2015-12-07 17:17:06操作系统版块每日发帖之星
日期:2015-12-27 06:20:002015亚冠之广州富力
日期:2015-07-08 15:48:31程序设计版块每日发帖之星
日期:2015-06-11 22:20:00
20 [报告]
发表于 2015-08-08 19:37 |只看该作者
回复 19# MMMIX
perl可读性好差


   

评分

参与人数 1信誉积分 +5 收起 理由
substr函数 + 5 神马都是浮云

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP