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に1つ以上のファイルを保存する必要があります。これはGBサイズに問題がある可能性があります。ファイル。次のように見えます。

  • 各ファイルのデータチャンクを配列(行と列)として読み込みます。
  • 配列を比較し、a(i,j)=b(i,j) の結果を使用して論理配列を作成します。
  • 出力を生成するために論理配列を使用します。
  • 出力を印刷し、次のブロックを読みます。

ファイルがソートされ、すべての行が含まれているので、非常に簡単です。

おすすめ記事