Intereting Posts
Не удалось войти в систему с паролем, а также с помощью otp в модуле pam Открыть несколько файлов в папках с определенным шаблоном имени Подключение к VirtualBox с хоста Windows на статический IP в гостевой системе с помощью Putty Возможно ли подделка определенного пути для процесса? проблема с паролем при подаче удаленного файла в diff Можно ли настроить yum для импорта ключей для репозиториев, не относящихся к Red Hat? Команды очереди при выполнении одной команды Почему getfacl удаляет ведущие / абсолютные пути? Запустить скрипт при запуске после всего остального Чрезвычайно высокая загрузка процессора и отставание от 3D-ускорения в Linux Mint (Virtual Box), но не с программным рендерингом Дисковое пространство на Fedora 12 Получение ошибки RE: операнд-оператор повторения недействителен в osx sed Манипулировать имя файла с помощью команды find Проверьте, есть ли в системе DVD-рекордеры? Не удалось войти в Spark, используя статический IP-адрес после перенаправления портов

Как распечатать разницу в двух текстовых файлах с помощью сценариев оболочки?

У меня есть два текстовых файла, содержащих список URL-адресов. Я хочу сравнить два файла и распечатать различия. Я знаю, что мы можем использовать «diff», но вот проблема. URL-адреса одного файла заполнены, например, http://google.com а в другом файле у них нет http:// , например google.com

Файл 1:

 http://google.com 

Файл 2:

 google.com 

Я хочу, чтобы они были проигнорированы и на самом деле были напечатаны только разные URL-адреса. Является ли это возможным?

Возьмем, к примеру, эти два файла:

 $ cat file1 http://google.com example.com http://foobar.org $ cat file2 example.com google.com foobar.org unique.url 

Я бы просто использовал инструмент, например sed чтобы удалить все до последнего вхождения // . Кроме того, чтобы использовать diff , оба файла нужно сортировать. Объединение двух дает нам:

 $ diff <(sed 's#.*//##' file1 | sort) <(sort file2) 3a4 > unique.url 

В качестве альтернативы используйте comm -3 :

 $ comm -3 <(sed 's#.*//##' file1 | sort) <(sort file2) unique.url 

Вы можете снова удалить ведущие пробелы с sed :

 $ comm -3 <(sed 's#.*//##' file1 | sort) <(sort file2) | sed 's/^\s*//' unique.url 

Другим подходом было бы удалить http:// из обоих файлов и распечатать то, что осталось, а затем передать его через uniq -u который будет печатать только уникальные строки. Поскольку те URL-адреса, которые присутствуют в обоих файлах, не будут уникальными, они будут печатать только те, которые присутствуют в одном из двух файлов:

 $ sed 's#.*//##' file1 file2 | sort | uniq -u unique.url 

Да, вы можете, например, использовать sed чтобы удалить определенные вещи, прежде чем переводить его в diff :

 $ diff file1 file2 1,3c1,3 < http://google.com/search < http://www.google.com < http://example.com --- > google.com/search > google.com > example.com $ < file1 sed 's|https\{0,1\}://||g' | diff - file2 2c2 < www.google.com --- > google.com 

Да, вы можете пропустить часть (например, http:// ) с помощью разделителя полей awk .

от manpage:

 NAME awk - pattern scanning and processing language 

 -F fs --field-separator fs Use fs for the input field separator (the value of the FS predefined variable). 

Пример:

 $ cat file1 http://google.com http://gnu.org http://fsf.org http://linux.stackexchange.com 

 $ cat file2 google.com gnu.org fsf.org unix.stackexchange.com 

 $ cat file1 | awk -F "http://" '{print $2}' google.com gnu.org fsf.org linux.stackexchange.com 

 $ cat file1 | awk -F "http://" '{print $2}' | diff - file2 4c4 < linux.stackexchange.com --- > unix.stackexchange.com 

Заметка:

  • Вы также можете использовать -F "://" для https:// или http://
  • Перед сопоставлением файлы должны быть sort