免费注册 查看新帖 |

Chinaunix

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

替换问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-05-14 15:48 |只看该作者 |倒序浏览
本帖最后由 newfinder 于 2014-05-14 15:49 编辑

假如有这样一个文件data1:
name1 A C AA SS AS SA 00 ……
name2 A H WW WA AA AW 00 ……
name3 A I AY YA YY AA 00 ……
name4 C H CC CZ ZZ ZC 00 ……
……


前三列是固定的,从第三列开始每两个字母是一列。而且第三列之后的那些字母都是两个字母的组合,但这两个字母中一定含有第二列的字母。现在想作替换,结果变为:


data2:
name1 A C AA CC AC CA 00 ……
name2 A H HH HA AA AH 00 ……
name3 A I AI IA II AA 00 ……
name4 C H CC CH HH HC 00 ……
……
00(零零)保持不变

也即把第三列之后的两个字母中不是第三列的替换为第三列的字母,第二列不变

大神们看这个该怎么写呢

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期: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未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
2 [报告]
发表于 2014-05-14 16:22 |只看该作者
回复 1# newfinder

$ cat ch.pl
use strict;
use warnings;

while(<DATA>){
  chomp;
  my ($sName, $sK1, $sK2, @aData) = split;
  my %hKey = ( $sK1 => $sK1, '0' => '0');
  foreach(@aData){
    s/(\S)/defined $hKey{$1}?$hKey{$1}:$sK2/ge;
  }
  $_ = join(" ", $sName, $sK1, $sK2, @aData);
  print "$_\n";;
}

__DATA__
name1 A C AA SS AS SA 00
name2 A H WW WA AA AW 00
name3 A I AY YA YY AA 00
name4 C H CC CZ ZZ ZC 00

$ perl ch.pl
name1 A C AA CC AC CA 00
name2 A H HH HA AA AH 00
name3 A I AI IA II AA 00
name4 C H CC CH HH HC 00

   

论坛徽章:
60
20周年集字徽章-20	
日期:2020-10-28 14:04:3015-16赛季CBA联赛之北京
日期:2016-07-06 15:42:0715-16赛季CBA联赛之同曦
日期:2016-06-12 10:38:0915-16赛季CBA联赛之佛山
日期:2016-05-27 11:54:56黄金圣斗士
日期:2015-12-02 11:44:35白银圣斗士
日期:2015-11-25 14:32:43白银圣斗士
日期:2015-11-23 12:53:352015亚冠之布里斯班狮吼
日期:2015-10-21 16:55:482015亚冠之首尔
日期:2015-09-01 16:46:052015亚冠之德黑兰石油
日期:2015-08-31 11:39:192015亚冠之萨济拖拉机
日期:2015-08-28 21:06:5315-16赛季CBA联赛之广东
日期:2016-07-12 14:58:53
3 [报告]
发表于 2014-05-14 17:01 |只看该作者
  1. #!usr/bin/python

  2. with open('file') as f:
  3.         lines = f.readlines()
  4.         for line in lines:
  5.                 l = line.strip().split()
  6.                 for n in range(3,len(l)):
  7.                         if l[n] == '00':continue
  8.                         p = list(l[n])
  9.                         for k,v in enumerate(p):
  10.                                 if v != l[1]:p[k] = l[2]
  11.                         l[n] = ''.join(p)
  12.                 print ' '.join(l)
复制代码
比较暴力!

论坛徽章:
0
4 [报告]
发表于 2014-05-14 17:36 |只看该作者
回复 2# jason680
32个赞……
太棒了!

   

论坛徽章:
0
5 [报告]
发表于 2014-05-14 17:37 |只看该作者
回复 3# reyleon
大神,请问这是python吗,我还没接触过python啊……

   

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
6 [报告]
发表于 2014-05-15 17:23 |只看该作者
  1. #!/usr/bin/perl
  2. while (<DATA>) {
  3.         @_ = split;
  4.         map { $_[$_] =~ s/[^0$_[1]$_[2]]/$_[2]/g } 3..$#_;
  5.         print join " ", @_, $/;
  6. }
  7. __DATA__
  8. name1 A C AA SS AS SA 00
  9. name2 A H WW WA AA AW 00
  10. name3 A I AY YA YY AA 00
  11. name4 C H CC CZ ZZ ZC 00
复制代码

论坛徽章:
2
巨蟹座
日期:2014-05-21 16:42:40巳蛇
日期:2014-05-22 08:44:29
7 [报告]
发表于 2014-05-15 21:43 |只看该作者
回复 6# yestreenstars


    好简洁啊!

论坛徽章:
0
8 [报告]
发表于 2014-05-16 16:31 |只看该作者
回复 6# yestreenstars
同意!!!

   

论坛徽章:
0
9 [报告]
发表于 2014-06-26 15:13 |只看该作者
mark down here

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
10 [报告]
发表于 2014-06-26 15:47 |只看该作者
回复 7# skyyy90


    你说的简洁,是看起来代码少,很漂亮,但这种代码难以理解,更难以调试,不过比贴二进制好点。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP