免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2340 | 回复: 7
打印 上一主题 下一主题

条件匹配后进行替换筛选 [复制链接]

论坛徽章:
2
2015年亚洲杯之沙特阿拉伯
日期:2015-03-27 17:28:472015年亚洲杯之韩国
日期:2015-03-27 22:34:22
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-08-18 23:20 |只看该作者 |倒序浏览
本帖最后由 tingshuibanxia 于 2016-09-05 19:43 编辑

假如文本A,以tab分隔:

2c    sss    e3rh48
d1   nnn    wure2
11    WW    34ER3
....

如果第二列内容匹配 sss 则以aa代替并输出此行内容
如果第二列内容匹配 nnn 则以bb代替并输出此行内容
第二列没有匹配到的行去掉,
得到:

2c    aa    e3rh48
11    bb    34ER3
....


用数组实现。大神帮忙看看代码有问题吗?哪里可以优化呢?

  1. #!/usr/bin/perl -w
  2. use strict;

  3. open (IN, "<", "A.txt") or die $!;
  4. open (OUT,">", "B.txt") or die $!;

  5. my @A;
  6. my @B;

  7. while (<IN>{
  8.     chomp;
  9.     @A = split("\t", $_);
  10.     @B = @A;
  11.     my $m = $A[1];
  12.     if ($m eq "sss"){
  13.         $m = "aa";
  14.         $B[1] = $m;
  15.     }elsif($m eq "nnn"){
  16.         $m = "bb"
  17.         $B[1] = $m;
  18.     }
  19.     print OUT @B;
  20. }
  21. close IN;
  22. close OUT;
复制代码

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
2 [报告]
发表于 2016-08-19 10:35 |只看该作者
  1. #!/usr/bin/perl -w
  2. use strict;

  3. while (<DATA>){
  4.     chomp;
  5.     my @A = split ("\t", $_);
  6.     my @B = @A;
  7.     my $m = $A[1];
  8.     if ($m eq 'f^ce,i'){
  9.         $B[1] = 'aa';
  10.     }
  11.     if ($m eq 'E,WE'){
  12.         $B[1] = 'bb';
  13.     }

  14.     if ($m ne $B[1]){
  15.         print "@B\n";
  16.     }
  17. }

  18. __DATA__
  19. 2c  f^ce,i  e3rh48
  20. d1  a,b11   wure2
  21. 11  E,WE    34ER3
复制代码
perl abc.pl
--------------------------------
2c aa e3rh48
11 bb 34ER3

论坛徽章:
6
丑牛
日期:2014-03-21 15:42:04子鼠
日期:2014-04-12 11:50:17处女座
日期:2014-09-01 09:25:1115-16赛季CBA联赛之吉林
日期:2015-12-22 14:01:5215-16赛季CBA联赛之广东
日期:2016-03-08 18:49:422016科比退役纪念章
日期:2016-07-06 12:19:55
3 [报告]
发表于 2016-08-19 10:56 |只看该作者
本帖最后由 stanley_tam 于 2016-08-19 10:58 编辑

  1. #!/usr/bin/perl -w
  2. use strict;

  3. open (IN, "<", "A.txt") or die $!;
  4. open (OUT,">", "B.txt") or die $!;

  5. # my @A;
  6. # my @B;

  7. my %hash = (
  8.     'f^ce,i' => 'aa',
  9.     'E,WE'   => 'bb',
  10. );

  11. while (<IN>) {
  12.     chomp;
  13.     my @A = split("\t", $_);
  14.     if (exists $hash{$A[1]}) {
  15.         $A[1] = $hash{$A[1]};
  16.         print OUT "@A$/";
  17.     }
  18.     # @B = @A;
  19.     # my $m = $A[1];
  20.     # if ($m eq "f^ce,i"){
  21.         # $m = "aa";
  22.         # $B[1] = $m;
  23.     # }elsif($m eq "E,WE"){
  24.     #     $m = "bb"
  25.     #     $B[1] = $m;
  26.     # }
  27.     # print OUT @B;
  28. }
  29. close IN;
  30. close OUT;
复制代码

论坛徽章:
2
2015年亚洲杯之沙特阿拉伯
日期:2015-03-27 17:28:472015年亚洲杯之韩国
日期:2015-03-27 22:34:22
4 [报告]
发表于 2016-08-19 21:23 |只看该作者
谢谢你们!小菜鸟在努力中~

论坛徽章:
2
2015年亚洲杯之沙特阿拉伯
日期:2015-03-27 17:28:472015年亚洲杯之韩国
日期:2015-03-27 22:34:22
5 [报告]
发表于 2016-08-20 17:19 |只看该作者
回复 3# stanley_tam


    再请教一下,我想输出文件列之间仍然以tab分隔:print OUT join("\t","@A$/"); 可是输出是空格分隔,为什么呢?

论坛徽章:
6
丑牛
日期:2014-03-21 15:42:04子鼠
日期:2014-04-12 11:50:17处女座
日期:2014-09-01 09:25:1115-16赛季CBA联赛之吉林
日期:2015-12-22 14:01:5215-16赛季CBA联赛之广东
日期:2016-03-08 18:49:422016科比退役纪念章
日期:2016-07-06 12:19:55
6 [报告]
发表于 2016-08-20 23:34 |只看该作者
本帖最后由 stanley_tam 于 2016-08-20 23:35 编辑

写成这样试试?

  1. my $line = join "\t", @A;
  2. print OUT "$line$/";
复制代码
回复 5# tingshuibanxia


   

评分

参与人数 1信誉积分 +20 收起 理由
tingshuibanxia + 20 赞一个!

查看全部评分

论坛徽章:
2
2015年亚洲杯之沙特阿拉伯
日期:2015-03-27 17:28:472015年亚洲杯之韩国
日期:2015-03-27 22:34:22
7 [报告]
发表于 2016-08-20 23:50 |只看该作者
回复 6# stanley_tam


    这样写可以!好神奇!

论坛徽章:
6
15-16赛季CBA联赛之新疆
日期:2016-03-22 22:34:5915-16赛季CBA联赛之山东
日期:2016-04-11 09:08:41程序设计版块每日发帖之星
日期:2016-06-28 06:20:00程序设计版块每日发帖之星
日期:2016-07-19 06:20:00每日论坛发贴之星
日期:2016-07-19 06:20:0015-16赛季CBA联赛之青岛
日期:2016-07-20 22:44:17
8 [报告]
发表于 2016-08-25 03:01 |只看该作者
$>  cat aa|perl -ne 'print if (s/f\^ce,i/aa/ + s/E,WE/bb/)'
2c    aa    e3rh48
11    bb    34ER3
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP