忘记密码   免费注册 查看新帖 |

ChinaUnix.net

  平台 论坛 博客 文库 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
最近访问板块 发新帖
查看: 1442 | 回复: 5

求助:perl 匹配替换的问题 [复制链接]

论坛徽章:
0
发表于 2018-04-25 22:36 |显示全部楼层
我有一个文件A,里面有两列,如下:
384208  chr1
384206  chr2
384197  chr3

……

还有另一个文件B,想把B中所有A里面第一列的内容替换为对应的第二列的内容,该怎么写脚本呢?
例如:
aaaaaaa384208bbbb
aaaaaaa384197ccccc
替换为:
aaaaaaachr1bbbb
aaaaaaachr2ccccc

A文件大约2万行,用sed似乎不太合适;
A里面都是一一对应切不重复的,本来把A写成了哈希,然后替换B文件中的,但一直报错,求各位大神帮忙!!!

论坛徽章:
0
发表于 2018-04-25 23:13 |显示全部楼层
以下是我自己写的,刚刚开始学,写的漏洞百出,请各位帮忙指点!
#!/usr/bin/perl
use strict;
my %hash_data;
open(FL,"name5");
while(<FL>)
{
        chomp();
        my ($dkey,$dval)= split(/\s+/,$_);
        $hash_data{$dkey}=$dval;
}
close(FL);
open (FF,"out5.recode.vcf");
while (<FF>){
        s/$tkey/$hash_data{$tkey}/ while $_ =~/$tkey/;
print $_;
}

论坛徽章:
8
双子座
日期:2013-08-31 07:37:12金牛座
日期:2013-09-09 18:49:12处女座
日期:2013-09-23 11:43:14处女座
日期:2013-10-09 19:48:21狮子座
日期:2014-03-24 18:22:12丑牛
日期:2014-04-22 22:07:51申猴
日期:2014-06-12 21:54:13双鱼座
日期:2014-06-13 21:52:31
发表于 2018-04-26 08:48 |显示全部楼层
回复 1# niuguohao

  1. [root@CIFU ~]# perl -lne '@ARGV==1 ? do{@F=split;$h{$F[0]}=$F[1]} : do{s/(\d+)/$h{$1}/e and print}' a b
  2. aaaaaaachr1bbbb
  3. aaaaaaachr3ccccc
  4. [root@CIFU ~]#
复制代码


论坛徽章:
0
发表于 2018-04-26 10:16 |显示全部楼层
回复 3# kernel69

感谢大神帮助,我还有问题,按照这样输出的结果好像仅是发生替换的行,如果想同时把没有替换过的行也输出该怎样写呢?


论坛徽章:
0
发表于 2018-04-26 11:26 |显示全部楼层
#!/usr/bin/perl
my %hash;
open(FL,"name5");
while(<FL>)
{
        chomp();
        my ($key,$val)= split(/\t+/,$_);
        $hash{$key}=$val;
        }
open (FF,"out5.recode.vcf");
while (<FF>){
        s/DF(\d+)\.1/$hash{$key}/e while $_=~/DF(\d+)\.1/;
        print $_;
        }
close(FL);
close(FF);

重新改了改,现在要替换的字符都被替换成空了……
我前面说的不对,,,文件A应该是这样的:
DF384205.1      Sme2.5_33732.1
DF384204.1      Sme2.5_33731.1
DF384203.1      Sme2.5_33728.1
…………



烦劳各位大神帮忙看看

论坛徽章:
8
双子座
日期:2013-08-31 07:37:12金牛座
日期:2013-09-09 18:49:12处女座
日期:2013-09-23 11:43:14处女座
日期:2013-10-09 19:48:21狮子座
日期:2014-03-24 18:22:12丑牛
日期:2014-04-22 22:07:51申猴
日期:2014-06-12 21:54:13双鱼座
日期:2014-06-13 21:52:31
发表于 2018-04-26 12:27 |显示全部楼层
回复 4# niuguohao

那就把and替换成;
  1. perl -lne '@ARGV==1 ? do{@F=split;$h{$F[0]}=$F[1]} : do{s/(\d+)/$h{$1}/e;print}' a b
复制代码

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

本版积分规则

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP