Сравните 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 - это номер строки и номер столбца (где значения не match)

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   

Примечание. Размер файла для сравнения указан в ГБ, файл разделен табуляцией и содержит более 250 столбцов, разделенных табуляцией.

0
22.02.2017, 14:00
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 должны содержать хотя бы один файл в ОЗУ, что может быть проблемой для ваших файлов размером в ГБ. Это может выглядеть так:

  • читать блоки данных из каждого файла в массив (строка и столбец)
  • сравнивать массивы и создавать логический массив с результатом a (i, j) = b (i, j)
  • us логический массив для создания вывода
  • вывода на печать и чтения следующего блока

Поскольку ваши файлы отсортированы и в них есть все строки, это довольно просто.

0
28.01.2020, 04:48

Теги

Похожие вопросы