Расширение однострочника awk от определения совпадающих пар столбцов (строка за строкой) до нескольких столбцов

Расширение однострочника awk от определения совпадающих пар столбцов (строка за строкой) до нескольких столбцов

Я использую Win7 с Cygwin. У меня есть однострочный код, который будет работать для определения совпадений в ПАРЕ столбцов, но когда я пытаюсь ввести дополнительные столбцы (например, >2), я не могу заставить его работать. Поэтому следующее работает для меня:

gawk -F "^" '{ if ($3 == $7) print "0"; else print $3,$7; }' infile.txt > outfile.txt

Однако при добавлении еще пары столбцов возникают синтаксические ошибки:

gawk -F "^" '{ if ($3 == $7 || $3 == $11) print "0"; else print $3,$7,$11; }' infile.txt > outfile.txt

Итак, что-то не так с командой, но сообщения об ошибках мне не особо помогают. Когда я заменяю "&&" на "||", я также получаю ошибки ("неожиданный символ новой строки или конца строки" сразу после первого "$7", а также "$3 не распознается как внутренняя или внешняя команда, исполняемая программа или пакетный файл").

Итак, вот пример входного файла, содержащего три строки с «^» в качестве разделителя столбцов:

paris^london^new york^paris^rome^paris

paris^london^munich^paris^rome^paris

paris^london^munich^berlin^rome^paris

Я хочу иметь возможность увидеть, соответствуют ли друг другу в каждой строке файла столбцы 1, 4 и 6. В этом случае строка 1 — это «да», строка 2 — это «да», а строка 3 — это «нет». Поэтому вывод должен показывать либо «0» для «да», либо повторять всю строку для «нет». Таким образом, вывод будет следующим:

0
0
paris^london^munich^berlin^rome^paris

Есть идеи ?

решение1

Постарайтесь избегать ||и&&

  • Для &&теста

    gawk -F "^" '$3 == $7{if($3 == $11){print "0"; next;}}{print $3,$7,$11}'

  • Для ||теста

    gawk -F "^" '$3 == $7{print "0"; next;}$3 == $11{print "0"; next;}{print $3,$7,$11}'

решение2

Наконец-то понял. Я использую Cygwin с Win7. Одинарные кавычки не годились, поэтому замена ВСЕХ одинарных кавычек на двойные исправила синтаксис, и, кроме того, "||" тоже не годилось, но "&&" работает отлично. Так что следующее работает:

gawk -F "^" "{ если ($1 == $2 && $3 == $4 && $4 == $5 && $5 == $6) вывести 0; иначе вывести $1,$2,$3; }" infile.txt > outfile.txt

Связанный контент