忘记密码   免费注册 查看新帖 |

ChinaUnix.net

  平台 论坛 博客 文库 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
12下一页
最近访问板块 发新帖
查看: 3128 | 回复: 14

perl两个文本库对比融合输出到第三个文本中,同一个坐标数据相同用A表示,不同B表示。 [复制链接]

论坛徽章:
0
发表于 2018-01-02 15:59 |显示全部楼层
文本1:共82列,76行。0011ab1b...
cgh1111n...
.................
文本2:共82列,76行.
01b1a11c...
1bh1v1nj...
.................

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

论坛徽章:
0
发表于 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;                                                           
}                                                                 


论坛徽章:
130
技术图书徽章
日期: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
发表于 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

论坛徽章:
0
发表于 2018-01-03 10:53 |显示全部楼层
回复 3# jason680

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

论坛徽章:
130
技术图书徽章
日期: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
发表于 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);
}

评分

参与人数 1信誉积分 +5 收起 理由
情节可以很简单 + 5 很给力!

查看全部评分

论坛徽章:
0
发表于 2018-01-03 14:56 |显示全部楼层
本帖最后由 情节可以很简单 于 2018-01-04 10:43 编辑

回复 5# jason680

谢谢大神,但是改完之后没有第三个文件输出。另外原有的2个文本A,B:其中A是我从Excel中复制到TXT文本中的,所以含有制表符或空格在其中(数据排列是圆形的,我试图去掉,但是变形了)。B文本是纯TXT。开始我以为这样不会影响比对,所以就没说明。

论坛徽章:
0
发表于 2018-01-03 15:42 |显示全部楼层
回复 5# jason680

抱歉多次打扰,但是我想说一下我目前的结果:这个程序能实现两个纯TXT文本对比,只是不能将结果输出到一个新的TXT中(在命令提示符窗口出现)。至于我原本A,B文件格式不同我再处理一下。

论坛徽章:
0
发表于 2018-01-04 13:36 |显示全部楼层
我也来一个ps版的:

1 使用管理员权限的cmd,运行下列命令:
"C:\WINDOWS\system32\windowspowershell\v1.0\powershell.exe" -command "Set-ExecutionPolicy -ExecutionPolicy Unrestricted"
"C:\WINDOWS\syswow64\windowspowershell\v1.0\powershell.exe" -command "Set-ExecutionPolicy -ExecutionPolicy Unrestricted"

2 编辑脚本中的文件路径,保存。并运行.ps1脚本:
这个脚本用5楼的数据,测试通过。如果有空格tab,先查找替换,删除它。



  1. #按字符,依次对比。支持powershell 2.0。并没有对大文件做优化。
  2. $输入文件1绝对路径 = 'a:\pscode\TEMP_2017\temp274\f3.txt'
  3. $输入文件2绝对路径 = 'a:\pscode\TEMP_2017\temp274\f4.txt'
  4. $输出文件绝对路径 = 'a:\pscode\TEMP_2017\temp274\out.txt'
  5. #
  6. #-----------------------------------------------------------------------------------
  7. $utf8 = [system.Text.Encoding]::UTF8
  8. $文件1 = [system.IO.File]::ReadAllText($输入文件1绝对路径,$utf8)
  9. $文件2 = [system.IO.File]::ReadAllText($输入文件2绝对路径,$utf8)

  10. for ($i = 0; $i -lt $文件1.Length ; $i++)
  11. {
  12.         $int1 = [int][char]$文件1[$i]
  13.         $int2 = [int][char]$文件2[$i]
  14.         switch ($i)
  15.         {
  16.                 0        
  17.                 {
  18.                         Set-Content -LiteralPath $输出文件绝对路径 -Value '' -NoNewline
  19.                 }
  20.                        
  21.                 {$int1 -eq 10}
  22.                 {
  23.                         Add-Content -LiteralPath $输出文件绝对路径 -Value ''
  24.                         break
  25.                 }
  26.                
  27.                 {$int1 -eq 13}
  28.                 {
  29.                         break
  30.                 }
  31.                
  32.                 {$int1 -eq $int2}
  33.                 {
  34.                         Add-Content -LiteralPath $输出文件绝对路径 -Value 'A' -Encoding UTF8 -NoNewline
  35.             break
  36.                 }
  37.                
  38.                 default
  39.                 {
  40.                         Add-Content -LiteralPath $输出文件绝对路径 -Value 'B' -Encoding UTF8 -NoNewline
  41.                 }
  42.         }
  43. }       
  44.        
复制代码

论坛徽章:
0
发表于 2018-01-05 16:42 |显示全部楼层
回复 8# 本友会机友会摄友会

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

论坛徽章:
0
发表于 2018-01-05 17:27 |显示全部楼层
1 把我写的脚本,用记事本,另存为a.ps1。编码为unicode。即bom头+utf16le格式。
2 修改脚本第2,3,4行,为实际的文本路径。
3 在你的命令行中,打【powershell.exe -file d:\a.ps1】  假设你的a.ps1保存到了d。

您需要登录后才可以回帖 登录 | 注册

本版积分规则

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802020122
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:wangnan@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP