Удалите дублирующиеся поля в данном столбце (после того, как идентификационная проверка)

Веб-сайт distrowatch сравнивает инструменты диспетчера пакетов и их опции всех известных дистрибутивов Linux.

3
21.08.2014, 12:46
2 ответа

Это достаточно просто в awk , используя массив , split и обычный цикл :

{
    split($2, elements, ",")
    out = ""
    for (i in elements) {
        el = elements[i]
        key = $1 " " el
        if (!(key in used)) {
            out = out el ","
        }
        used[key] = 1
    }
    sub(/,$/, "", out)
    $2 = out
}
1

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

Мы сохраняем набор значений, которые мы уже видели в (ассоциативном) массиве used . Мы создаем строку key , содержащую как значение первого столбца, так и значение второго, на которое мы в данный момент смотрим. Если ключ находится в используется , мы уже видели этот ключ раньше для этого идентификатора и не должны помещать его в вывод; в противном случае оно новое, и мы объединяем значение в out . Чтобы мы больше не использовали его, мы сохраняем ключ (который будет чем-то вроде « A 3 ») в нашем наборе видимых элементов.

Наконец, мы помещаем составленный список обратно во второй столбец. По сути, это подход, который вы бы применили на любом другом языке.

Поместите приведенный выше код в файл и запустите его с помощью awk -f или заключите его в одинарные кавычки в качестве аргумента командной строки.

7
27.01.2020, 21:10
perl -lpe 's/(\S+)\s+\K\S+/join ",", grep {!$seen{$1}->{$_}++} split ",", $&/e'
3
27.01.2020, 21:10

Теги

Похожие вопросы