用于比较和排序具有不同字数的2个文件的命令

时间:2013-04-18 21:02:35

标签: perl unix compare

您好我有2个内容混乱的文件。 File1可能有一个低于另一个的100个字符串,而文件2例如有200个。

这样的东西
File1 a-->001 b-->002 c-->003 d-->004 e-->005
File2 b-->001 c-->003 d-->009 e-->005 z-->026 y--> 025 0-->15 p-->16 a--> 001

我希望它像这样安排,以便我能看到相应的差异

File1 a-->001 b-->002 c-->003 d-->004 e-->005
File2 a-->001 b-->001 c-->003 d-->009 e-->005 z-->026 y--> 025 0-->15 p-->16 

我尝试了sort命令sort file1和sort file2以及diff -y -suppress-common-lines file1 file2> diff.txt但是当我说一个以a开头的10个单词时,这个就搞砸了。因此它将显示所有10个a后跟b ..那么有没有其他方法可以做到这一点?

1 个答案:

答案 0 :(得分:0)

您可以使用此perl脚本:

#!/usr/bin/perl
use strict;

if ($#ARGV != 1)
{
    print "\nUsage: test.pl File1 File2\n\n";
    exit();
}

my $file1 = getFile($ARGV[0]);
my $file2 = getFile($ARGV[1]);

my $r = {};
while (my ($k, $v) = each %$file1)
{
    if (!exists($file2->{$k}))
    {
        $r->{$k} = "[$v, undef]";
    }
    elsif ($v ne $file2->{$k})
    {
        $r->{$k} = "[$v, $file2->{$k}]";
    }
    delete $file2->{$k};
}
while (my ($k, $v) = each %$file2)
{
    $r->{$k} = "[undef, $v]";
}

foreach (sort keys %$r)
{
    print "$_ -> $r->{$_}\n";
}

sub getFile($)
{
    my $f;
    return open($f, shift()) ? return { (join('', <$f>) =~ /[\s\n\r^](\w+)\s*-+>\s*(\d+)/g) } : {};
}