сравнить два поля не в одном столбце для всех строк - PullRequest
0 голосов
/ 09 марта 2019

Мой вопрос такой, как здесь: сравнить два поля не в одном столбце в последовательных строках

Но, разница в том, что я хотел бы сделать это для всех строк, а не толькопоследовательно, используя awk.

Спасибо за любую помощь!

Редактировать: Например, я хочу отметить строки, где $ 2 == $ 4 (в другой строке)и $ 3 == $ 5 (в другой строке) начальный файл:

c3 1 63072 1 63072
c3 18109 29942 13125 25007
c3 18105 26056 14949 22881
c3 19004 26038 18102 25145
c3 14949 22881 18105 26056
c3 18102 25145 19004 26038
c3 18090 26038 13562 21528
c3 18964 26028 18532 25565
c3 14162 21991 10076 17931
c3 18964 26038 9921 17008

и желаемый результат:

c3 1 63072 1 63072 Not_Equal
c3 18109 29942 13125 25007 Not_Equal
c3 18105 26056 14949 22881 Not_Equal
c3 19004 26038 18102 25145 Not_Equal
c3 14949 22881 18105 26056 Equal
c3 18102 25145 19004 26038 Equal
c3 18090 26038 13562 21528 Not_Equal
c3 18964 26028 18532 25565 Not_Equal

, потому что 5-я строка такая же, как 3-яи 6-е - это то же самое, 4-е.(и я хотел бы, чтобы это сравнение было сделано для секций, где первый столбец такой же - Пример ниже )

Уточнение:

c3 1 63072 1 63072 Not_Equal
c3 18109 29942 13125 25007 Not_Equal
c3 18105 26056 14949 22881 Not_Equal
c3 19004 26038 18102 25145 Not_Equal
c3 14949 22881 18105 26056 Equal
c3 18102 25145 19004 26038 Equal
c3 18090 26038 13562 21528 Not_Equal
c3 18964 26028 18532 25565 Not_Equal
a3 1 63072 1 63072 Not_Equal
a3 13125 25007 18109 29942 Not_Equal

Таким образом, хотя последняя строка совпадает со второй, поскольку первый столбец отличается, он не равен

1 Ответ

0 голосов
/ 09 марта 2019

Не могли бы вы попробовать один раз (проверено только в данных образцах).

Без проверки условия для 1-го столбца: 1-й столбец с значениями c / a былиНЕ учитывается во входном файле этого кода.

awk '
FNR==NR{
  a[++count]=$0
  next
}
{
  for(i=1;i<=FNR;i++){
    split(a[i],array," ")
       if($3==array[1] && $2==array[4] && i!=FNR){
           print $0,"Equal"
           next
       }
  }
}
{
  print $0,"NOT Equal"
}'   Input_file  Input_file

Как работает код:

  • Он будет читать файл ввода 2 раза.
  • При первом запуске файла Input_file будет сохранено значение полной строки в массив.
  • Затем при втором запуске будет выполняться цикл для каждой строки от 1 до значения строки (так чтоделая это, он должен охватывать все строки ДО проверки всех строк.
  • добавили СПЕЦИФИЧЕСКОЕ СОСТОЯНИЕ (Убедитесь, что при проверке равен ли 3-й столбец текущей строки 1-му элементу массива (который фактически является 1-м значением поля, которое мы сохранили)в 1-й серии Input_file) И 2-е поле равно 4-му элементу массива (который является 4-м столбцом строк, сохраненных в 1-й серии Input_file). Если мы внимательно посмотрим, ваша самая первая строка имеет 1 63072 1 63072, где 1-е поле равно 3-муполе и от 2 до 4тh SO Я добавил условие, что это совпадение НЕ должно выполняться в одной и той же строке, чтобы избежать появления здесь «ЛОЖНЫХ ПОЗИТИВОВ».

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

1 63072 1 63072 NOT Equal
18109 29942 13125 25007 NOT Equal
18105 26056 14949 22881 NOT Equal
19004 26038 18102 25145 NOT Equal
14949 22881 18105 26056 Equal
18102 25145 19004 26038 Equal
18090 26038 13562 21528 NOT Equal
18964 26028 18532 25565 NOT Equal
14162 21991 10076 17931 NOT Equal
18964 26038 9921 17008 NOT Equal

РЕДАКТИРОВАТЬ (с добавлением $ 1 к проверке условий): Так как OP тоже хочет проверять $ 1 (со значениями c / a и т. Д.), Поэтому добавление этой проверки условий также происходит сейчас.

awk '
FNR==NR{
  a[++count]=$0
  b[$1]=$1
  next
}
{
  for(i=1;i<=FNR;i++){
    split(a[i],array," ")
       if(b[$1]==array[1] && $4==array[2] && $2==array[4] && i!=FNR){
           print $0,"Equal"
           next
       }
  }
}
{
  print $0,"NOT Equal"
}'  Input_file  Input_file

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

c3 1 63072 1 63072 NOT Equal
c3 18109 29942 13125 25007 NOT Equal
c3 18105 26056 14949 22881 NOT Equal
c3 19004 26038 18102 25145 NOT Equal
c3 14949 22881 18105 26056 Equal
c3 18102 25145 19004 26038 Equal
c3 18090 26038 13562 21528 NOT Equal
c3 18964 26028 18532 25565 NOT Equal
a3 1 63072 1 63072 NOT Equal
a3 13125 25007 18109 29942 NOT Equal



ОБЩИЕ Решения (и) для чтения Input_file из обоих (вверх-вниз)И вплоть до):

Добавление еще 1 ОБЩЕГО решения (немного улучшен ответ выше).Я просто подумал, что если A=B ИСТИНА, то B=A тоже ИСТИНА.Означает, что пример OP проверяет только от первой до последней строки.Имеется в виду, если элементы 3-й строки (1-й столбец равен EQUAL 3-му столбцу 5-й строки) Тогда для 1-го столбца 5-й строки и 3-ей строки должно быть ИСТИНА, так что теперь они ОБА должны быть записаны как EQUAL, если это может помочь вам тогдапопробуйте следующее.

Без проверки условия для 1-го столбца: 1-й столбец со значениями c / a НЕ учитывался во входном файле этого кода.

awk '
FNR==NR{
  a[++count]=$0
  next
}
{
  for(i=1;i<=count;i++){
    split(a[i],array," ")
       if($3==array[1] && $2==array[4] && i!=FNR){
           print $0,"Equal"
           next
       }
  }
}
{
  print $0,"NOT Equal"
}'  Input_file Input_file

РЕДАКТИРОВАТЬ (с добавлением $ 1 к проверке условий): Так как OP тоже хочет сравнить $ 1 (со значениями c / a и т. Д.), Поэтому решение изменилось так же, как и сейчас.

awk '
FNR==NR{
  a[++count]=$0
  b[$1]=$1
  next
}
{
  for(i=1;i<=count;i++){
    split(a[i],array," ")
       if(b[$1]==array[1] && $4==array[2] && $2==array[4] && i!=FNR){
           print $0,"Equal"
           next
       }
  }
}
{
  print $0,"NOT Equal"
}'  Input_file  Input_file

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

c3 1 63072 1 63072 NOT Equal
c3 18109 29942 13125 25007 NOT Equal
c3 18105 26056 14949 22881 Equal
c3 19004 26038 18102 25145 Equal
c3 14949 22881 18105 26056 Equal
c3 18102 25145 19004 26038 Equal
c3 18090 26038 13562 21528 NOT Equal
c3 18964 26028 18532 25565 NOT Equal
a3 1 63072 1 63072 NOT Equal
a3 13125 25007 18109 29942 NOT Equal
...