Обнаружение полудублирующих записей в Bash / AWK - PullRequest
0 голосов
/ 02 ноября 2019

Прямо сейчас у меня есть скрипт, который просматривает табличные данные для перекрестной ссылки на запись по записи (используя AWK). Но я столкнулся с проблемой. AWK отлично подходит для построчных сравнений, чтобы проходить через отформатированные данные, но я также хочу обнаруживать полудублированные записи. К сожалению, uniq не будет работать сам по себе, поскольку запись не является копией на 100%.

Это упорядоченный список, отсортированный по второму и третьему столбцам. То, что я хочу обнаружить, это те же значения в столбцах 3, 6 и 7

Вот пример:

JJ   0072  0128  V7589  N     22.35   22.35   0.00   Auth
JJ   0073  0128  V7589  N     22.35   22.35   0.00   Auth

Второе число отличается, в то время как другая информация точно такая же, поэтомуuniq не найдет его в одиночку.

Есть ли в AWK что-то, что позволяет мне ссылаться на предыдущую строку? У меня уже есть этот блок кода от AWK, идущий построчно. ( EDIT оператор awk был более старой версией, которая была ужасна)

awk '{printf "%s", $0; if($6 != $7 && $9 != "Void" && $5 == "N") {printf "****\n"} else {printf "\n"}}' /tmp/verbout.txt

Ответы [ 2 ]

0 голосов
/ 02 ноября 2019

Один из способов сделать это с awk -

$ awk '{print $0, (a[$3,$6,$7]++?"duplicate":"")' file

. Это пометит дубликаты записей, обратите внимание, что вам не нужно сортировать файл.

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

$ awk '!a[$3,$6,$7]++' file

, сортировка не требуется.

0 голосов
/ 02 ноября 2019

Есть ли в AWK что-то, что позволяет мне ссылаться на предыдущую строку?

Нет, но ничто не мешает вам явно сохранить определенную информацию из последней строкии используя это позже:

{
    if (last3 != $3 || last6 != $6 || last7 != $7) {
        print
    } else
        handle duplicate here
    }
    last3=$3
    last6=$6
    last7=$7
}

Все переменные lastN (эффективно) по умолчанию устанавливаются на пустую строку в начале, тогда мы просто сравниваем каждую строку с этой и выводим эту строку, если таковые имеются.

Затем мы сохраняем поля из этой строки, чтобы использовать их для следующей.


То есть, конечно, предполагается, что дубликаты должны обнаруживаться только в том случае, если они являются последовательными. Если вы хотите удалить дубликаты, когда порядок не имеет значения, вы можете вначале sort в этих полях.

Если порядок должен быть сохранен, вы можете использовать ассоциативный массив для хранения факта, что ключ имеетбыло замечено раньше, что-то вроде:

{
    seenkey = $3" "$6" "$7
    if (seen[seenkey] == 0) {
        print
        seen[seenkey] = 1
    } else {
        handle duplicate here
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...