Как я могу удалить частичные дубликаты в bash, используя awk, grep или sort?
Я попробовал sort -u FILE | uniq -w20 но это не совсем надежно.

Входные данные:

http://www.website.com/1.file
http://www.website.com/2.file
http://www.website.com/3.file
http://www.someotherwebsite.com/1.file
http://www.someotherwebsite.com/2.file
http://www.someotherwebsite.com/3.file

Ожидаемый результат:

http://www.website.com/3.file
http://www.someotherwebsite.com/3.file

1 ответ1

1

Одно решение, если все общие строки правильно сформированы, это использовать awk и использовать первые три поля в качестве ключа, например:

awk -F/ '{a[$1$2$3]=$0} END {for(k in a) {print a[k]}}'

Это разделит каждую строку на поля на основе / в качестве разделителя. Мы используем первые 3 поля в качестве ключа в массиве и сохраняем всю строку в качестве значения.

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

Как и предполагалось, мы могли бы сделать это немного более гибким, просто сняв последнюю часть и сравнив остальные:

awk -F/ '{orig=$0; $NF=""; a[$0]=orig} END {for(k in a) {print a[k]}}'

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .