Не могли бы вы попробовать один раз (проверено только в данных образцах).
Без проверки условия для 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