忘记密码   免费注册 查看新帖 | 论坛精华区

ChinaUnix.net

  平台 论坛 博客 认证专区 大话IT HPC论坛 徽章 文库 沙龙 自测 下载 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
最近访问板块 发新帖
查看: 613 | 回复: 4

小白求指点 [复制链接]

论坛徽章:
0
发表于 2017-08-21 11:23 |显示全部楼层
大家好!我想根据一列ID,从一个总文件中提取匹配这个ID的信息,比如:
ID文件:
AAA1
CCC2
DDD3
总文件:
>Tar AAA1|test  pp
QQQQQQ
QQ
>AAA2_test
QQQQQQQQQQ
>test|DDD3  ID:777
QQQQQQQ
QQQQQQ
QQQQQ
得到:
>Tar AAA1|test  pp
QQQQQQ
QQ
>test|DDD3  ID:777
QQQQQQQ
QQQQQQ
QQQQQ
下边是我的脚本,但是总文件ID情况并不是刚刚好一样,需要匹配,不知道这里怎么写了,求大神指点!

my $list = shift @ARGV;
my $fasta = shift @ARGV;
my $out = shift @ARGV;
my %select;
open L, "$list" or die;
while (<L>) {
    chomp;
    s/>//g;
    $select{$_} = 1;
}
close L;

$/ = "\n>";
open O, ">$out" or die;
open F, "$fasta" or die;
while (<F>) {
    s/>//g;
    my ($id) = split (/\n/, $_);
    print O ">$_" if (defined $select{$id});
}
close F;
close O;

论坛徽章:
27
15-16赛季CBA联赛之八一
日期:2016-02-22 19:10:4215-16赛季CBA联赛之深圳
日期:2016-12-01 10:34:0415-16赛季CBA联赛之新疆
日期:2016-12-07 10:24:2915-16赛季CBA联赛之同曦
日期:2016-12-15 12:06:43CU十四周年纪念徽章
日期:2016-12-18 13:03:4415-16赛季CBA联赛之吉林
日期:2017-01-03 15:52:2515-16赛季CBA联赛之辽宁
日期:2017-01-04 14:58:2415-16赛季CBA联赛之辽宁
日期:2017-01-15 09:42:512016科比退役纪念章
日期:2017-02-06 17:21:50黑曼巴
日期:2017-02-10 15:46:1215-16赛季CBA联赛之上海
日期:2017-03-18 10:14:5415-16赛季CBA联赛之青岛
日期:2017-03-18 22:00:44
发表于 2017-08-21 12:20 |显示全部楼层

  1. awk 'NR==FNR{a[$1];next}/>/{f=0;for(i in a)if(index($0,i)){f=1;break}}f' id.txt data.txt
复制代码

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
发表于 2017-08-21 21:27 |显示全部楼层
看不懂需求,ID信息出现在 TAR 命令后,还可能出现在管道符号 | 后,直到下一个 > 命令提示符出现吗?

论坛徽章:
0
发表于 2017-08-23 10:56 |显示全部楼层
回复 3# 104359176

对对,>符号是固定的一行,后面跟的一串信息包含里包含ID

论坛徽章:
120
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07巳蛇
日期:2014-05-09 16:43:18巨蟹座
日期:2014-10-23 17:48:38子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59
发表于 2017-08-23 11:50 |显示全部楼层
回复 1# Eva326

$ perl get_fasta_id_list.pl
Usage  : get_fasta_id_list.pl ID_LIST FASTA_FILE OUTPUT
Example: get_fasta_id_list.pl id.txt  a.fas  out.fas  


$ perl get_fasta_id_list.pl id.txt a.fas out.fas
Output file: out.fas

$ cat id.txt
AAA1
CCC2
DDD3

$ cat a.fas
>Tar AAA1|test  pp
QQQQQQ
QQ
>AAA2_test
QQQQQQQQQQ
>test|DDD3  ID:777
QQQQQQQ
QQQQQQ
QQQQQ

$ cat out.fas
>Tar AAA1|test  pp
QQQQQQ
QQ
>test|DDD3  ID:777
QQQQQQQ
QQQQQQ
QQQQQ



$ cat get_fasta_id_list.pl

use strict;
use warnings;

sub message{
  print <<EOF;
Usage  : $0 ID_LIST FASTA_FILE OUTPUT
Example: $0 id.txt  a.fas  out.fas  

EOF
  exit 1;
}

message() if(@ARGV != 3);
my ($Fid, $Ffas, $Fout) = @ARGV;
open(FHid,  "<", "$Fid")  or die "cannot open $Fid\n";
open(FHfas, "<", "$Ffas") or die "cannot open $Ffas\n";
open(FHout, ">", "$Fout") or die "cannot open $Fout\n";

my $sRE ="\\b(";
while (<FHid>) {
    chomp;
    s/>//g;
    $sRE .= "$_|";
}
close FHid;
$sRE =~ s/[|]$/)\\b/;

my $sMatch = 0;
while (<FHfas>) {
    if(m/^>/){
      $sMatch = m/$sRE/? 1: 0;
    }
    if($sMatch){
      print FHout "$_";
    }
   
}
close FHfas;
close FHout;
print "Output file: $Fout\n";

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

本版积分规则

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802020122
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP