免费注册 查看新帖 |

ChinaUnix.net

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3121 | 回复: 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
复制代码

论坛徽章:
0
发表于 2018-12-25 20:30 |显示全部楼层
#!/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 ;
        print $_;
        }
close(FL);
close(FF);
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

基于案例的 SQL 优化实战训练营

讲师:中电福富特级专家梁敬彬,参与本次课程培训,你将收获:
1. 能编写出较为高效的 SQL;
2. 能解决70%以上的数据库常见优化问题;
3. 能得到老师提供的高效的相关工具和解决方案;
4. 能举一反三,收获不仅仅是 SQL 优化。
现在购票享受8.8折优惠!
----------------------------------------
优惠时间:2019年3月20日前

大会官网>>
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP