免费注册 查看新帖 |

Chinaunix

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

请问两个文件内容匹配问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-06-27 00:26 |只看该作者 |倒序浏览
有两个文件,第一个文件中如果含有第二个文件中的字符串,就改成这字符串后加z,
比如 a文件
aaa
bb
cc dd ee
ff
b 文件
aa
bb
dd
ee
生成的文件是
aaa
bbz
cc ddz eez
ff
第一行的aaa 由于不是一个独立的字,所以没改变。
哪位大虾帮忙如何实现

论坛徽章:
0
2 [报告]
发表于 2007-06-27 14:49 |只看该作者
open FD1, 'file1' ;
open FD2, 'file2' ;
my $line2 ;
$line2 .= $_ while <FD2> ;
my @array2 = split /\s+/ , $line2 ;
my $line1 ;
$line1 .= $_ while <FD1> ;
$line1 =~ s/(\s+)($_)(\s+)/\1\2z\3/g foreach @array2 ;
close FD1 ;
open FD1, '>file1' ;
print FD1 $line1 ;

论坛徽章:
0
3 [报告]
发表于 2008-03-06 18:03 |只看该作者
using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;
using System.IO;

namespace ConsoleApplication1
{
    /*
    * 有两个文件,第一个文件中如果含有第二个文件中的字符串,就改成字符串后加Z
    比如a文件
    aaa
    bb
    cc dd ee
    ff
    b 文件
    aa
    bb
    dd
    ee
    生成的文件是
    aaa
    bbz
    cc ddz eez
    ff
    第一行的aaa 由于不是一个独立的字,所以没改变。
    哪位大虾帮忙如何实现

             */
    class Program
    {
        static void Main(string[] args)
        {
            Replace();
        }

        // 替换函数
        static private string ReplaceCC(Match m)
        {
            return m.Value + "z"; // 替换成aaz模式
        }


        static private void Replace()
        {
            
            string line = string.Empty;
            string sPattern = string.Empty;
            // 把b文件中的数据读成一个正则表达式
            using (StreamReader sr = new StreamReader("b"))
            {
                while ((line = sr.ReadLine()) != null)
                {
                    line.Trim();
                    sPattern += line + "|";
                }
                sPattern = sPattern.TrimEnd('|');
            }

            // 自定义的一个正则表达式匹配替换对象
            MatchEvaluator myEvaluator = new MatchEvaluator(ReplaceCC);

            using(StreamWriter swrite = new StreamWriter("c", false))
            {
                using (StreamReader sr = new StreamReader("a"))
                {
                    // 读入A文件中一行,对该行替换
                    while ((line = sr.ReadLine()) != null)
                    {
                        // 写入到C文件中
                        swrite.WriteLine(Regex.Replace(line, sPattern, myEvaluator));
                    }
                }
            }
        }
    }
}

论坛徽章:
0
4 [报告]
发表于 2008-03-06 20:45 |只看该作者
原帖由 perlliker 于 2007-6-27 00:26 发表
有两个文件,第一个文件中如果含有第二个文件中的字符串,就改成这字符串后加z,
比如 a文件
aaa
bb
cc dd ee
ff
b 文件
aa
bb
dd
ee
生成的文件是
aaa
bbz
cc ddz eez
ff
第一行的aaa 由于不是 ...

轻松
你先把第二个文件里面的word hash一遍

  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. my %hash;
  5. open my $second,"<","b" or die "Fail to open file b $!";
  6. while(<$second>){
  7.      chomp;
  8.      $hash{$_}++ foreach (split/\s+/);
  9.      }

  10. @ARGV= qw (a);
  11. $^I = ".bak";
  12. while(<>){
  13.      chomp;
  14.      foreach(split/\s+/){
  15.           $_ .= "z" if $hash{$_};
  16.           print "$_ ";
  17.           }
  18.      print "\n";
  19.      }
复制代码

结果
<lig@other-server:~/chinaunix>$ cat a
aaa
bb
cc dd ee
ff
<lig@other-server:~/chinaunix>$ cat b
aa
bb
dd
ee
<lig@other-server:~/chinaunix>$ ./change
<lig@other-server:~/chinaunix>$ cat a
aaa
bbz
cc ddz eez
ff
<lig@other-server:~/chinaunix>$ cat a.bak
aaa
bb
cc dd ee
ff

a.bak是a文件的备份

论坛徽章:
0
5 [报告]
发表于 2009-08-15 22:35 |只看该作者

回复 #4 churchmice 的帖子

$hash{$_}++ foreach (split/\s+/);
请问这句什么意思啊?

论坛徽章:
0
6 [报告]
发表于 2009-08-16 13:01 |只看该作者

回复 #5 rainbowshine521 的帖子

$hash{$_}++ foreach (split/\s+/);

  1. foreach my $item (split/\s+/,$_){
  2.   $hash{$item} ++;
  3. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP