Веб-сайт distrowatch сравнивает инструменты диспетчера пакетов и их опции всех известных дистрибутивов Linux.
Это достаточно просто в 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
или заключите его в одинарные кавычки в качестве аргумента командной строки.
perl -lpe 's/(\S+)\s+\K\S+/join ",", grep {!$seen{$1}->{$_}++} split ",", $&/e'