比较 2 个文件并打印 TEST2.txt 中不匹配记录的行号和每个不匹配记录的列号

比较 2 个文件并打印 TEST2.txt 中不匹配记录的行号和每个不匹配记录的列号

在TEST1.txt中

ID_ID   First_name    Last_name   Address                        Contact_Number
ID1     John          Rock        32, Park Lake, California           2222200000
ID2     Tommy         Hill    5322 Otter Lane Middleberge         3333300000
ID3     Leonardo      Test        Half-Way Pond, Georgetown           4444400000
ID8     Rhyan         Bigsh       6762,33 Ave N,St. Petersburg        5555500000
ID50    Steve         Goldberg    6762,33 Ave N,St. Petersburg        6666600000

&&

在TEST2.txt中

ID_ID   First_name    Last_name   Address                        Contact_Number
ID1     John          Rock        32, Park Lake, California           2222200000
ID2     Tommy1        Hill1       5322 Otter Lane Middleberge         3333300000
ID3     Leonardo      Test        Half-Way Pond, Georgetown           4444400000
ID80    Sylvester     Stallone                                    5555500000
ID50    Steve         Goldberg    6762,33 Ave N,St. Petersburg    6666600000
ID60    Mark          Waugh       St. Petersburg                  7777700000

期望的结果:-

TEST2.txt 中的差异是行号和列号(其中值不匹配)

Line No. 2 COLUMN NO 2,3    
Line No. 4 COLUNN NO 1,2,3,4 
Line No. 6 COLUNN NO 1,2,3,4,5   

注意:要比较的文件大小以 GB 为单位,文件是制表符分隔的,并且有超过 250 个制表符分隔的列。

答案1

笨拙但有效:

BEGIN {
    FS=OFS="\t"
}

NR==FNR {
# 5 = number of columns
    for (i=0;i<=5;i++) {
        a[$1,i]=$i }
    }

{ if ( a[$1,0] != $0 ) {
    b=""
    for (i=1;i<=5;i++) {
        if ( a[$1,i] != $i ) {
            b=b i", "
            }
        }
    print "Line No." FNR," Column No. ",b
    }
}

不过,我强烈建议您为此编写一个(例如)FORTRAN 程序,因为您可以读取大块的数据,例如 10,000 行,而awk解决方案需要在 RAM 中保存至少一个文件,这对您来说可能是个问题GB 大小的文件。它可能看起来像这样:

  • 将每个文件中的数据块读入数组(行和列)
  • 比较数组并使用 a(i,j)=b(i,j) 的结果创建逻辑数组
  • 我们使用逻辑数组来创建输出
  • 打印输出并读取下一个块

由于您的文件已排序并包含所有行,因此相当简单。

相关内容