Дедуплицировать, а затем показать уникальные имена/строки

Работая над SEO, у меня есть клиентский сайт, на котором загружены сотни, а то и тысячи изображений.

Я просканировал сайт с помощью SEO-паука Screaming Frog и сегментировал данные сканирования, чтобы вывести список всех изображений, используемых на сайте, и я загрузил локальную копию папки, в которую загружены изображения.

Мне не нужно сравнивать реальные файлы, достаточно 2 списков названий всех файлов (те или иные файлы, такие задачи у меня довольно распространены).

Мне удобно работать с Sublime Text (с его многочисленными курсорами и расширенными функциями поиска и замены), и я знаком с инструментами командной строки, такими как grep. (пользователь Mac)

Я предполагаю, что первым шагом будет устранение дубликатов в каждом списке, а затем сравнение списков, которое даст список файлов, которые находятся как в «списке 1», так и в «списке 2» и/или которые не находятся в «списке 1». ", но находятся в "списке 2".

Ответы (4)

Вы можете использовать VLOOKUP()функцию в Excel (или в эквивалентной электронной таблице). Это самый быстрый способ и не требует программирования. Функция ВПР хорошо описана в Интернете. Но если вы где-то застряли, добавьте комментарий, и я вам помогу.

Возможным ограничением является ограничение по высоте листа - он может иметь до 1 048 576 строк.

Когда я просмотрел оба ответа выше, они были «правильными», и я отметил их как таковые.

Разбираясь с этим, мой друг рассказал мне о команде Bash для «уникального».

Оказывается, он uniqиспользуется вместе сsort.

Как только я узнал название, быстрый поиск выдал этот ответ Stackoverflow .

Не могли бы вы включить пример в свой ответ? Спасибо!

Я бы использовал python ( уже установленный на mac/linux/unix и доступный для Windows) , что-то вроде:

from glob import glob

actual_files = set(glob('/path/to/images/*.jpg')) # The actual files as a set

with open('list/of/Images/Referenced') as f: # Assuming that you have the referenced files as one per line with just the image tags
   rf = [fp for fp in f.readlines().split('/')[-1]] # You only need the actual filename
referenced_files = set(rf) # Make a list of unique references
unused = actual_files - referenced_files
print('Files Present But Unused:', unused)
missing = referenced_files - actual_files
print ('Files Referenced But Missing;', missing)

NB . Я не проверял вышеизложенное и предполагаю, что ваш список файлов — это один путь к файлу на строку, и больше ничего в строке нет.

Обратите внимание, что вы можете использовать поисковый робот python ( scrapy ) для сканирования сайта и удаленного ssh, также из python, чтобы получить список для автоматизации всего процесса, если вам нужно делать что-то подобное регулярно.

Имея два отсортированных файла, команда commвыводит строки, уникальные для того или иного файла. Сначала вам нужно удалить часть каталога, которая sed. Используйте comm -12для просмотра общих строк, comm -23для просмотра строк, уникальных для первого файла, и comm -13для просмотра строк, уникальных для второго файла.

<remote-name-list.txt sed -e 's!.*/!!' | sort >remote-name-list.sorted.txt
<local-name-list.txt sed -e 's!.*/!!' | sort >local-name-list.sorted.txt
comm -23 remote-name-list.sorted.txt local-name-list.sorted.txt >remote-only.txt

Если вы хотите увидеть только список имен без дублирования, вы можете использовать sort -u. Если вас интересуют дубликаты, направьте их в uniq.

<local-name-list.txt sed -e 's!.*/!!' | sort | uniq -c | grep -v '^ *1 '

Если в какой-то момент вы захотите сравнить содержимое файла, вы можете использовать fdupes ( доступно в Homebrew ). Для поиска визуально похожих изображений можно использовать findimagedupes .

Спасибо за подробный ответ. У меня еще не было времени попробовать это, но это дает мне возможность многому научиться. И все, что доступно в Homebrew, прекрасно, поскольку его очень легко использовать.