Chinaunix

标题: perl两个文本库对比融合输出到第三个文本中,同一个坐标数据相同用A表示,不同B表示。 [打印本页]

作者: 情节可以很简单    时间: 2018-01-02 15:59
标题: perl两个文本库对比融合输出到第三个文本中,同一个坐标数据相同用A表示,不同B表示。
文本1:共82列,76行。0011ab1b...
cgh1111n...
.................
文本2:共82列,76行.
01b1a11c...
1bh1v1nj...
.................

结果输出文本3中:共82列,76行.
BBBABBAB...
BBBABABB...
...................
跪求大神。。

作者: 情节可以很简单    时间: 2018-01-03 09:27
本帖最后由 情节可以很简单 于 2018-01-03 10:00 编辑

谢谢各位了!求别沉!我在for循环时,不知道怎样表达 对2个文件中“每个元素”进行对比,以前只处理过对某列数据提取。
下面是我尝试的两种方案:但是“@”这个符号报错,怎么用?
#########方案一
open A,"A.txt";
open B,"B.txt";
open E,">E.txt";
@a=<A>;
@b=<B>;
@a=map split @a;
@b=map split @b;
$a=@a;
for (1..$a)
{
if ($a[$_]==$b[$_])
{print E "A";}
else
{print E "B";}
}

###########方案二:"$A"报错,而且并没有输出第三个文件。
open $A, '>A.txt';                                                
open $B, '>B.txt';                                                
while ($m = <$A>) {                                               
    $n = <$B>;                                                   
    chomp $m;                                                     
    chomp $n;                                                     
    print X($m,$n), "\n";                                         
}                                                                 
sub X{                                                            
    my ($m, $n) = @_;                                             
    my $r;                                                        
    for (0..length($n)) {                                         
        $r .= substr($m, $_, 1) eq substr($n, $_, 1)?'A':'B';     
    }                                                            
    $r;                                                           
}                                                                 



作者: jason680    时间: 2018-01-03 10:04
回复 1# 情节可以很简单

$ cat f1.txt
0011ab1b
cgh1111n

$ cat f2.txt
01b1a11c
1bh1v1nj

$ awk -vFS="" '{getline b < "f2.txt";t=split(b,a,"");s="";for(n=1;n<=NF;++n)s=s (a[n]==$n?"A":"B");print s}' f1.txt
ABBAABAB
BBAABABB


作者: 情节可以很简单    时间: 2018-01-03 10:53
回复 3# jason680

前辈您好!可能是我太缺乏搭建环境的能力,这个程序在运行时好多错误,另外我用的是Windows系统,会有影响吗?

捕获1.PNG (19.6 KB, 下载次数: 56)

捕获1.PNG

作者: jason680    时间: 2018-01-03 11:38
回复 4# 情节可以很简单

C:\>type A.txt
0011ab1b
cgh1111n
C:\>type B.txt
01b1a11c
1bh1v1nj
C:\>perl hyj3.pl
ABBAABAB
BBAABABB

C:\>type hyj3.pl
use strict;
use warnings;

open(FHA, '<A.txt') or die "can't open A.txt\n";
open(FHB, '<B.txt') or die "can't open B.txt\n";
while (my $m = <FHA>) {
    my $n = <FHB>;
    chomp $m;
    chomp $n;
    print X($m,$n), "\n";
}
sub X{
    my ($m, $n) = @_;
    my ($r) = "";
    for (0..length($n)-1) {
        $r .= (substr($m, $_, 1) eq substr($n, $_, 1)?'A':'B');
    }
    return($r);
}


作者: 情节可以很简单    时间: 2018-01-03 14:56
本帖最后由 情节可以很简单 于 2018-01-04 10:43 编辑

回复 5# jason680

谢谢大神,但是改完之后没有第三个文件输出。另外原有的2个文本A,B:其中A是我从Excel中复制到TXT文本中的,所以含有制表符或空格在其中(数据排列是圆形的,我试图去掉,但是变形了)。B文本是纯TXT。开始我以为这样不会影响比对,所以就没说明。
作者: 情节可以很简单    时间: 2018-01-03 15:42
回复 5# jason680

抱歉多次打扰,但是我想说一下我目前的结果:这个程序能实现两个纯TXT文本对比,只是不能将结果输出到一个新的TXT中(在命令提示符窗口出现)。至于我原本A,B文件格式不同我再处理一下。
作者: 本友会机友会摄友会    时间: 2018-01-04 13:36
提示: 作者被禁止或删除 内容自动屏蔽
作者: 情节可以很简单    时间: 2018-01-05 16:42
回复 8# 本友会机友会摄友会

您好,非常感谢回复!可是我没有运行出来啊~~我好笨敢问开头的“$utf8 = [system.Text.Encoding]::UTF8”是什么意思啊。。这与开头需要Cmd的 windowshath\...的有关吗

捕获.PNG (35.01 KB, 下载次数: 61)

捕获.PNG

作者: 本友会机友会摄友会    时间: 2018-01-05 17:27
提示: 作者被禁止或删除 内容自动屏蔽
作者: 情节可以很简单    时间: 2018-01-09 09:56
回复 10# 本友会机友会摄友会

不好意思,这两天我才学习了Unicode的相关知识,但我的系统有点问题,没能读出“.psl”。我还有一个问题:
我的A,B文本数据是圆形的(不是严格等距递增),例如:
      gj1k
    g5kn1k
  d6ig7n130
  dfkl35hbn
   83onbdf
    jkdhl9
     lkgt
或者四角的空格用一个点“.”或“0”表示:
......gj1k......
....g5kn1k....
..d6ig7n130.
..dfkl35hbn..
...83onbdf...
.....jkdhl9.....
......lkgt.......

我在判断的时候需要对比“中间圆形字符”,四角的直接输出“.”。
我想加一个if()判断,如果A文件是“\n”或“.”或“0”,则输出“.”,else再进行eq对比判断。
可是在If()括号里我该怎么表示文件的每一个元素呢?或者怎么区分字母数字和空格?实验几次输出的结果要么全是“.”,要么那一行只有一个“.”
不知道这样个想法对不对,请求支援,谢谢!


作者: 情节可以很简单    时间: 2018-01-09 11:05
回复 10# 本友会机友会摄友会

不会删帖子,刚才自己搞出来了!见笑了~~,我是在原来的脚本上改的。如下:会有错,但输出文件正确。
open(FHA, '<A.txt') or die "can't open A.txt\n";               
open(FHB, '<B.txt') or die "can't open B.txt\n";
open(OUT,'>E.txt') or die "can't open E.txt\n";

while (my $m = <FHA>) {                                       
    my $n = <FHB>;                                             
    chomp $m;                                                  
    chomp $n;
    print OUT X($m,$n), "\n";                                             
}                                                              
sub X{                                                         
    my ($m, $n) = @_;                                          
    my ($r) = "";                                             
    for (0..length($m)-1) {
       if ((substr($m, $_, 1) == "0") && (substr($n, $_, 1) == substr($m, $_, 1)))
       {
         $r .= ".";
       }

       else
       {
         $r .= (substr($m, $_, 1) eq substr($n, $_, 1)?'A':'z');
       }                                   
    }                                                         
    return($r);                                                   
}



作者: 情节可以很简单    时间: 2018-01-09 11:05
回复 10# 本友会机友会摄友会

不会删帖子,刚才自己搞出来了!见笑了~~,我是在原来的脚本上改的。如下:会有错,但输出文件正确。
open(FHA, '<A.txt') or die "can't open A.txt\n";               
open(FHB, '<B.txt') or die "can't open B.txt\n";
open(OUT,'>E.txt') or die "can't open E.txt\n";

while (my $m = <FHA>) {                                       
    my $n = <FHB>;                                             
    chomp $m;                                                  
    chomp $n;
    print OUT X($m,$n), "\n";                                             
}                                                              
sub X{                                                         
    my ($m, $n) = @_;                                          
    my ($r) = "";                                             
    for (0..length($m)-1) {
       if ((substr($m, $_, 1) == "0") && (substr($n, $_, 1) == substr($m, $_, 1)))
       {
         $r .= ".";
       }

       else
       {
         $r .= (substr($m, $_, 1) eq substr($n, $_, 1)?'A':'z');
       }                                   
    }                                                         
    return($r);                                                   
}



作者: 情节可以很简单    时间: 2018-01-09 11:05
回复 10# 本友会机友会摄友会

不会删帖子,刚才自己搞出来了!见笑了~~,我是在原来的脚本上改的。如下:会有错,但输出文件正确。
open(FHA, '<A.txt') or die "can't open A.txt\n";               
open(FHB, '<B.txt') or die "can't open B.txt\n";
open(OUT,'>E.txt') or die "can't open E.txt\n";

while (my $m = <FHA>) {                                       
    my $n = <FHB>;                                             
    chomp $m;                                                  
    chomp $n;
    print OUT X($m,$n), "\n";                                             
}                                                              
sub X{                                                         
    my ($m, $n) = @_;                                          
    my ($r) = "";                                             
    for (0..length($m)-1) {
       if ((substr($m, $_, 1) == "0") && (substr($n, $_, 1) == substr($m, $_, 1)))
       {
         $r .= ".";
       }

       else
       {
         $r .= (substr($m, $_, 1) eq substr($n, $_, 1)?'A':'z');
       }                                   
    }                                                         
    return($r);                                                   
}



作者: 情节可以很简单    时间: 2018-01-09 11:07
回复 10# 本友会机友会摄友会

大神我自己弄出来了!不会删帖子,所以再次回复,谢谢解惑!我是在原来脚本基础上改的,给需要的人看吧:open(FHA, '<A.txt') or die "can't open A.txt\n";               
open(FHB, '<B.txt') or die "can't open B.txt\n";
open(OUT,'>E.txt') or die "can't open E.txt\n";

while (my $m = <FHA>) {                                       
    my $n = <FHB>;                                             
    chomp $m;                                                  
    chomp $n;
    print OUT X($m,$n), "\n";                                             
}                                                              
sub X{                                                         
    my ($m, $n) = @_;                                          
    my ($r) = "";                                             
    for (0..length($m)-1) {
       if ((substr($m, $_, 1) == "0") && (substr($n, $_, 1) == substr($m, $_, 1)))
       {
         $r .= ".";
       }

       else
       {
         $r .= (substr($m, $_, 1) eq substr($n, $_, 1)?'A':'z');
       }                                   
    }                                                         
    return($r);                                                   
}






欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2