Intereting Posts

Как проверить, какие строки из файла A отсутствуют в файле B, не отображая ничего, что присутствует в файле B, а не в файле A?

У меня есть текстовый файл, например sitelist1.txt (Файл A), который имеет некоторые URL-адреса, как показано ниже:

http://www.facebook.com http://www.twitter.com http://myspace.com/profile http://orkut.com/archived 

У меня есть другой текстовый файл, например sitelist2.txt (Файл B), который имеет множество существующих URL-адресов.

Я пытался:

 fgrep -v -f sitelist1.txt sitelist2.txt 

Проблема в том, что это также отображает URL-адреса, которые присутствуют в файле sitelist2.txt, а не в файле sitelist1.txt

-v вами-это делает его противоположным тому, что вы намереваетесь, – он показывает вам, для каждой строки в sitelist1.txt , все строки в sitelist2.txt , которые не совпадают. Значит, вы видите много дубликатов, я бы поспорил. Вы хотите использовать ту же команду без опции -v :

 fgrep -f sitelist1.txt sitelist2.txt 

Это выполнит следующую английскую директиву: для каждой строки в sitelist1.txt покажите мне все строки в sitelist2.txt которые содержат интересующую меня строку 1 строки, как всю строку или как часть строки файла 2.

Опция -v является опцией «инвертировать совпадение», которая показывает все несоответствующие строки.

Ответ Джона (помимо недоразумений, отмеченных в комментариях по этому вопросу), является ответом на вопрос, однако я хотел бы также указать, что для простых операций, подобных этому, combine (часть moreutils ) является хорошим выбором; он очень прост в использовании, поскольку позволяет выразить операцию, выполняемую с помощью логических операторов (AND, OR, NOT и XOR):

 combine sitelist1.txt NOT sitelist2.txt 
 % cat sitelist1.txt http://www.facebook.com http://www.twitter.com http://myspace.com/profile http://orkut.com/archived % cat sitelist2.txt http://www.facebook.com http://www.twitter.com http://myspace.com/profile % combine sitelist1.txt NOT sitelist2.txt http://orkut.com/archived 

В отличие от большинства утилит входные файлы не нужно сортировать (хотя я бы догадался, что они все еще отсортированы внутри), однако, как и при использовании fgrep в случае дубликатов строк в sitelist1.txt , t хотите напечатать. Если sitelist1.txt содержит повторяющиеся строки, и вы не хотите их печатать, вам нужно будет вывести вывод combine для sort -u :

 combine sitelist1.txt NOT sitelist2.txt | sort -u 

Если вы ищете полные URL-адреса в каждой строке, а не подстроки, вы можете использовать comm

comm -23 <(sort -u fileA) <(sort -u fileB)

Объяснение:
comm ожидает сортировку ввода, поэтому мы сначала сортируем и создаем уникальные файлы (sort -u file) .
Далее – используйте замену процесса для передачи вывода sort -u в качестве «файла» в comm, поскольку comm ожидает файлы: comm <() <() .
Last – подавление столбцов 2 (строки, уникальные для файла B) и 3 (линии, общие для обоих файлов) для вывода только строк в столбце 1 (строки, уникальные для файла A).