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

Вероятно, вы захотите заключить управляющие коды терминала в \[...\], чтобы сообщить Bash, что они на самом деле не печатают символы.В противном случае они будут путать оболочку, когда она попытается подсчитать, насколько широка подсказка.

Так что используйте "\[\e[91m\]xxx\[\e[0m\]".

Из руководства:

\[  Begin a sequence of non-printing characters. 
    This could be used to embed a terminal control sequence into the prompt.
\]  End a sequence of non-printing characters.

0
28.03.2016, 19:55
3 ответа

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

fgrep -f sitelist1.txt sitelist2.txt

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

Параметр -v - это параметр «инвертировать совпадение», который показывает все несовпадающие строки.

3
28.01.2020, 02:14

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

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

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

2
28.01.2020, 02:14

Ответ Джона (помимо недоразумения, указанного в комментариях под вопросом) является ответом на вопрос, однако я хотел бы также отметить, что для простых операций, подобных этой, комбинируйте (часть of 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 , которые не используются ' не хочу, чтобы их печатали. Если sitelist1.txt содержит повторяющиеся строки, и вы не хотите их печатать, вам придется направить вывод объединить в sort -u :

combine sitelist1.txt NOT sitelist2.txt | sort -u
2
28.01.2020, 02:14

Теги

Похожие вопросы