Сравнение столбцов в отдельном файле по столбцам

#awk

#awk

Вопрос:

Я пытаюсь сравнить два разных файла, скажем, «file1» и «file2», поля по столбцам $ 1 и $ 2 одинаковы в обоих файлах, если какое-либо значение отличается в одном столбце, затем выведите столбцы 1 и 2 и номер столбца, в котором было обнаружено несоответствие, als выводит значение, найденное в последнем столбце с ошибкой строки.

file1

 36829.00  37145.00  10801  36840.00 36888.00  37146.00  37576 5 1 
36833.00  38033.00  21601  36840.00 36888.00  37602.00  38464 5 1
37265.00  38105.00  25921  36840.00 36900.00  37674.00  38536 6 2
37271.00  38885.00   8841  36840.00 36876.00  38454.00  38894 4 3
  

file2

 36829.00  37145.00  10801  36840.00 36888.00  37146.00  37576 5 1
36833.00  38033.00  21601  36840.00 36888.00  37602.00  38464 3 1
37265.00  38105.00  25921  36840.00 36900.00  37674.00  38536 6 2
37271.00  38885.00   8840  36840.00 36876.00  38454.00  38894 4 3
  

Desired output

Несоответствие в # ( # — значение последнего столбца в строке с ошибкой)

 Mismatch in 1: 36833.00  38033.00 column 8
Mismatch in 3: 37271.00  38885.00 column 4
  

I tried

 awk 'NR==FNR{a[$1,$2];next} ($1,$2) in a' file1 file2
  

Заранее спасибо

Ответ №1:

Вот одно совпадение по номерам записей файлов:

 awk '
NR == FNR {
    a[FNR] = $0                  # match on FNR, you could use a[$1, $2]
    next
}
{
    n = split(a[FNR], b, FS)
    for (i = 3; i <= n; i  ) {
        if (b[i] != $i) {
            printf "Mismatch in %d: %s %s column %dn", FNR, $1, $2, i
        }                        # for 0 starting record numbering use FNR-1 above
    }
}' file1 file2
  

Вывод:

 Mismatch in 2: 36833.00 38033.00 column 8
Mismatch in 4: 37271.00 38885.00 column 3
  

Комментарии:

1. Джеймс, спасибо за код, он отлично работает, ценю вашу помощь

Ответ №2:

Не могли бы вы попробовать следующее (если я правильно понял ваш вопрос, основываясь только на ваших примерах). Это также должно устранить множественные несоответствия в одной строке (допустим, в строке есть несоответствия 3-го и 5-го столбцов, тогда они будут напечатаны оба).

 awk '
FNR==NR{
  a[FNR]=$0
  b[FNR]=$1 OFS $2
  next
}
{
  num=split(a[FNR],array," ")
  for(i=3;i<=num;i  ){
     if($i!=array[i]){
        val=(val?val ",":"")i
     }
  }
  if(val){
     print "Mismatch in line" FNR": " b[FNR]" column(s) "val
     val=""
  }
}'   Input_file1  Input_file2
  

Вывод будет следующим.

 Mismatch in line2: 36833.00 38033.00 column(s) 8
Mismatch in line4: 37271.00 38885.00 column(s) 3
  

Комментарии:

1. Мистер РавиндерСингх13, спасибо за код, он отлично работает, ценю вашу помощь

Ответ №3:

попробуйте gnu awk:

 awk 'NR==FNR{r[NR]=$0;next}{x=split(r[FNR],a);for(i=3;i<=9;i  ){if($i!=a[i]) print "Mismatch in "a[9]": "$1,$2" column "i}}' file1 file2