免费注册 查看新帖 |

Chinaunix

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

求助:文本处理 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-09-27 21:18 |只看该作者 |倒序浏览
本帖最后由 僵尸 于 2012-09-27 21:19 编辑

我有一段文本如下:
jiangyi,55
wucheng,34
lixi,22
baisui,55
.....


另外我有个参考文本(约5000行),如下
jiangyi,江益
luxi,鲁溪
lixi,礼溪
wucheng,吴城
.....

最后我想得到

江益,55
吴城,34
礼溪,22
白水,55


不知道有啥好办法可以这样处理

论坛徽章:
0
2 [报告]
发表于 2012-09-28 00:12 |只看该作者
组织成两个hash
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. my %a = (a => 1);
  5. my %b = (a => 2);

  6. foreach my $key (keys %a) {
  7.     print "$a{$key},$b{$key}\n" if exists $b{$key};
  8. }
复制代码

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
3 [报告]
发表于 2012-09-28 02:43 |只看该作者

可以这样处理:
  1. open my $f2, 'file2';
  2. my %d = map { chomp; split ',' } <$f2>;
  3. open my $f, 'file1';
  4. while (<$f>) {
  5.     my ( $e, $n ) = split /(?=,)/;
  6.     print $d{$e} ? $d{$e} : $e, $n;
  7. }
复制代码

论坛徽章:
0
4 [报告]
发表于 2012-09-28 13:17 |只看该作者
把文件2作为替换列表,用正则替换做可行么..

论坛徽章:
0
5 [报告]
发表于 2012-09-28 13:58 |只看该作者
本帖最后由 僵尸 于 2012-09-28 13:59 编辑
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. my %hash;

  5. open FILE2, "2.txt";
  6. open FILE1, "1.txt";
  7. open OUTPUT, ">out.txt";

  8. while (<FILE2>) {
  9.    chomp;
  10.    (my $key, my $value) = split(/,/);
  11.    $hash{$key} = $value;
  12. }

  13. while (<FILE1>) {
  14.    s/^(\w+),/$hash{$1},/g;
  15.    #print $1;
  16.    print OUTPUT $_;
  17. }
复制代码
我用这种方法基本实现了.还有啥好办法么

论坛徽章:
2
CU大牛徽章
日期:2013-04-17 11:46:28CU大牛徽章
日期:2013-04-17 11:46:39
6 [报告]
发表于 2012-09-28 21:46 |只看该作者
@僵尸
办法已经很好吧,还有更好的么?

论坛徽章:
15
2015年辞旧岁徽章
日期:2015-03-03 16:54:15双鱼座
日期:2015-01-15 17:29:44午马
日期:2015-01-06 17:06:51子鼠
日期:2014-11-24 10:11:13寅虎
日期:2014-08-18 07:10:55酉鸡
日期:2014-04-02 12:24:51双子座
日期:2014-04-02 12:19:44天秤座
日期:2014-03-17 11:43:36亥猪
日期:2014-03-13 08:13:51未羊
日期:2014-03-11 12:42:03白羊座
日期:2013-11-20 10:15:18CU大牛徽章
日期:2013-04-17 11:48:45
7 [报告]
发表于 2012-10-11 12:58 |只看该作者
By awk
  1. awk -F, 'NR==FNR{a[$1]=$2;next} $1=a[$1]' file2 OFS=, file1
复制代码

论坛徽章:
0
8 [报告]
发表于 2012-11-08 11:06 |只看该作者
僵尸 发表于 2012-09-28 13:58
我用这种方法基本实现了.还有啥好办法么


有个问题,1.txt如果含有2.txt没有的文本,就会导致被替换成空白,有什么办法解决不

论坛徽章:
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
9 [报告]
发表于 2012-11-08 13:18 |只看该作者
回复 8# 僵尸

would you like to check it with exists

$perldoc -f exists

       exists EXPR
               Given an expression that specifies an element of a hash,
               returns true if the specified element in the hash has ever been
               initialized, even if the corresponding value is undefined.

                   print "Exists\n"    if exists $hash{$key};
                   print "Defined\n"   if defined $hash{$key};
                   print "True\n"      if $hash{$key};

   

论坛徽章:
0
10 [报告]
发表于 2012-11-08 14:24 |只看该作者
我想如果2.txt没有的替换内容,就保持1.txt原因的文本
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP