我想区分2个文件。想要特别找到使用Unix Scripting发生差异的列

时间:2012-01-04 20:09:46

标签: perl shell unix solaris nawk

我们正在进行从Informix迁移到Oracle的数据迁移项目。现在需要比较Informix和oracle表之间的数据。因此,Informix中的Table1将迁移到Oracle中的Table1 现在,数据已从Informix中的Table1迁移到Oracle中的Table1。我将这两个表中的数据分成2个平面文件。我想看看2个文件中是否存在任何数据差异。

File1已经说出100万条记录,300列,File2表示100万条记录,300列。 File1File2是管道分隔文件。因此差异可以在文件中的任何位置。几乎整行都可以匹配,但是在一列/两列中可能存在差异。所以我想找出差异,记住所有上述事情。差异输出应列出row1 in file1 is not matching with row1 in file2 at column 3之类的内容以及两个文件中列的值。两个文件的所有这些差异都需要在控制台上列出,并且外行可以理解。

我想用一个例子来解释它,以便更清楚。

我的第一个文件,如下所示:

col1|col2|col3|col4|col5|col6
1234|ramyakrishna|4567|ramya.krishna@worse.com|228802|worse
1235|Chandan|4567|chandan.kumar@worse.com|228862|worse
1236|Kacitha|4567|kacitha.mishra@worse.com|228872|worse
1238|Shajin|4567|shajin.mahesh@worse.com|228873|worse

我的第二个文件如下:

col1|col2|col3|col4|col5|col6
1234|ramyakrishna|4567|ramya.krishna@good.com|228802|good
1235|Chandan|4567|chandan.kumar@worse.com|228789|worse
1236|Kacitha|4567|kacitha.mishra@worse.com|228872|worse

所以当我比较两个文件时。我们发现col4中的col6row2存在差异。所以我想要这样的东西:

1234|ramyakrishna|4567|ramya.krishna@good.com|228802|good
:COL4-EXPECTED-ramya.krishna@worse.com:COL6-EXPECTED-worse

因此应该打印第二个文件中的上一行。然后应打印预期值。

我知道在使用任何脚本之前需要对文件进行排序。


对于fge的脚本,我得到如下的输出:

我得到如下的输出

$perl diff.perl    

Line 1: different value for column 38 (was g, expected w)
Line 1: different value for column 40 (was o, expected r)
Line 1: different value for column 41 (was d, expected s)
Line 1: different value for column 42 (was ., expected e)
Line 1: different value for column 43 (was c, expected .)
Line 1: different value for column 44 (was o, expected c)
Line 1: different value for column 45 (was m, expected o)
Line 1: different value for column 46 (was |, expected m)

我想要整列比较。文件是|分隔文件。

3 个答案:

答案 0 :(得分:2)

假设文件按相同顺序排序,请查看commdiff。请注意,这可以在线路级别上运行。要深入了解字段级别的差异,您可以从不同行级别的子集总数开始。

答案 1 :(得分:2)

这样的事情(在perl中)可能会这样 - 它假设文件具有相同的行数,但可以使用wc轻松检查,并且没有行是空的:

#!/usr/bin/perl -W
use strict;

open FILE1, "file1" or die;
open FILE2, "file2" or die;

my (@cols1, @cols2);
my ($val1, $val2);
my $linenr = 0;

while (my $line = <FILE1>) {
    @cols1 = split('|', $line);
    @cols2 = split('|', <FILE2>);
    $linenr++;

    for (my $i = 0; $i <= $#cols1; $i++) {
        $val1 = $cols1[$i]; $val2 = $cols2[$i];
        if ("$val1" ne "$val2") {
            printf("Line %d: different value for column %d (was %s, expected %s)\n",
                $linenr, $i+1, $val2, $val1);
    }
}

答案 2 :(得分:0)

我建议WinMerge比较两个大文件,因为它很快。不幸的是,它仅在Windows中可用(很快就会在linux中提供)。

由于您的平面文件来自数据库,因此您可以在转储表时轻松对其进行排序。然后使用winmerge比较文件。

希望这有帮助。