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

ChinaUnix.net

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

perl替换 [复制链接]

论坛徽章:
0
发表于 2017-04-24 22:34 |显示全部楼层
新手求大神指导,谢谢!
(1)读取input1.txt文件,以第1列为key,第2列为value.
(2)读取input2.txt文件,根据第2列信息,把第2列信息替换成规则(1)中的value


input1:
1        A1BG
2        A2M

input2:
9606         1        GO:0003674        molecular_function
9606         1        GO:0005576        extracellular region
9606         1        GO:0005615        extracellular space
9606                1      GO:0008150         biological_process
9606                1        GO:0070062        extracellular exosome
9606               1        GO:0072562        blood microparticle
9606               2        GO:0001869        negative regulation of complement activation, lectin pathway
9606               2        GO:0002020        protease binding
9606               2        GO:0002576        platelet degranulation

output:
9606         A1BG        GO:0003674        molecular_function
9606                A1BG        GO:0005576        extracellular region
9606         A1BG        GO:0005615        extracellular space
9606                A1BG        GO:0008150        biological_process
9606                A1BG        GO:0070062        extracellular exosome
9606                A1BG        GO:0072562        blood microparticle
9606                A2M               GO:0001869        negative regulation of complement activation, lectin pathway
9606                A2M              GO:0002020        protease binding
9606            A2M              GO:0002576        platelet degranulation


论坛徽章:
108
技术图书徽章
日期: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-04-25 06:17 |显示全部楼层
回复 1# Quinta11

$ hexdump -C input1.txt
00000000  31 09 41 31 42 47 0a 32  09 41 32 4d 0a           |1.A1BG.2.A2M.|
0000000d

#Note:  tab key ("\t") in input1.txt and input2.txt


$ cat input1.txt
1    A1BG
2    A2M

$ cat input2.txt
9606    1    GO:0003674    molecular_function
9606    1    GO:0005576    extracellular region
9606    1    GO:0005615    extracellular space
9606    1    GO:0008150    biological_process
9606    1    GO:0070062    extracellular exosome
9606    1    GO:0072562    blood microparticle
9606    2    GO:0001869    negative regulation of complement activation, lectin pathway
9606    2    GO:0002020    protease binding
9606    2    GO:0002576    platelet degranulation

$ perl chg_xxx.pl input1.txt input2.txt
Output file: output.txt

$ cat output.txt
9606    A1BG    GO:0003674    molecular_function
9606    A1BG    GO:0005576    extracellular region
9606    A1BG    GO:0005615    extracellular space
9606    A1BG    GO:0008150    biological_process
9606    A1BG    GO:0070062    extracellular exosome
9606    A1BG    GO:0072562    blood microparticle
9606    A2M    GO:0001869    negative regulation of complement activation, lectin pathway
9606    A2M    GO:0002020    protease binding
9606    A2M    GO:0002576    platelet degranulation

$ cat chg_xxx.pl
#! /usr/bin/perl

use strict;
use warnings;

sub message{
  print <<EOF;
Usage  : $0 KEY_FILE   GENE_FILE
Example: $0 input1.txt input2.txt
EOF
  exit 1;
}

message() if @ARGV != 2;

my $sFout = "output.txt";

my %hKey;

my($sFkey, $sFgen)  = @ARGV;

open(my $FHkey, "<", $sFkey) or die "cannot open $sFkey file\n";
open(my $FHgen, "<", $sFgen) or die "cannot open $sFgen file\n";
open(my $FHout, ">", $sFout) or die "cannot oepn $sFout file\n";

print "Output file: $sFout\n";

while(<$FHkey>){
  s/^\s+|\s+$//g;
  next if(m/^(#|$)/);
  my($sKey, $sValue) = split;
  $hKey{$sKey} = $sValue;
}

while(<$FHgen>){
  s/^\s+|\s+$//g;
  next if(m/^(#|$)/);
  my @aData = split/\t/;
  if(exists $hKey{$aData[1]}){
    $aData[1] = $hKey{$aData[1]};
  }
  print {$FHout} join("\t",@aData),"\n";
}

论坛徽章:
0
发表于 2017-04-25 09:58 |显示全部楼层
回复 2# jason680

真的很感谢大神指导,问题解决了,谢谢!

论坛徽章:
0
发表于 2017-04-25 10:00 |显示全部楼层
我按照大神的指导做了相应的修改,以及将问题完美解决了


# #!usr/bin/perl -w
use strict;

my %hash;

open IN1,'<C:\Users\lenovo\Desktop\Perl_Resolution\Level1\29.geneID2Name\input1.txt'
or die "Can't open the file: $!";
open IN2,'<C:\Users\lenovo\Desktop\Perl_Resolution\Level1\29.geneID2Name\input2.txt'
or die "Can't open the file: $!";
open OUT,'>C:\Users\lenovo\Desktop\Perl_Resolution\Level1\29.geneID2Name\output.txt'
or die "Can't write the file: $!";

while(<IN1>
{
        chomp;   #将换行符去掉
        s/\r//g; #删除回车符
        next if(!$_); #如果没有文件行就退出
        my ($k,$v) = split(/\s+/,$_); #将第一个文件存到哈希中
        $hash{$k}= $v;
       
}

while(<IN2>{
        chomp;   #将换行符去掉
        s/\r//g; #删除回车符
        next if(!$_); #如果没有文件行就退出
        my @aData = split/\t/;
        if(exists $hash{$aData[1]})  #如果哈希表中存在第一列的数据
        {
                $aData[1] = $hash{$aData[1]};    #将第一列所对应的值写到第一列中
        }
  print OUT join("\t",@aData),"\n";
}

close IN1;
close IN2;
close OUT;
您需要登录后才可以回帖 登录 | 注册

本版积分规则

【有奖调查】AI时代如何迎接未知挑战?

人工智能一直在医疗行业扮演着重要角色,最早的专家系统和后来的基因诊断都是人工智能技术在医疗的行业探索。近年来,随着深度学习等技术的进步,人工智能在医疗行业的应用领域不断扩展,医学影像智能诊断、语音电子病历、癌症智能诊断等均已逐渐成为热门发展方向。
而作为人工智能重要推动力的深度学习技术的快速发展却亟需认知系统的强力支撑。
----------------------------------------
活动时间:2017年5月15日-6月5日

调查入口>>
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP