Да. Стандартный grep
инструмент для поиска файлов по текстовым строкам можно использовать для вычитания всех строк в одном файле из другого.
grep -F -x -v -f fileB fileA
Это работает, используя каждую строку в fileB как pattern ( -f fileB
) и обрабатывая ее как простую строку для соответствия (не регулярное регулярное выражение) ( -F
). Вы заставляете совпадение происходить по всей строке ( -x
) и выводите только те строки, которые не совпадают ( -v
). Поэтому вы печатаете строки в файле A, которые не содержат те же данные, что и строки в файле B.
Недостатком этого решения является то, что оно не учитывает порядок строк, и если ваш ввод содержит повторяющиеся строки в разных местах, вы можете не получить то, что ожидаете. Решением этой проблемы является использование реального инструмента сравнения, такого как diff
. Это можно сделать, создав файл diff со значением контекста в 100% строк в файле, а затем проанализировав его только для строк, которые будут удалены при преобразовании файла A в файл B. (Обратите внимание, что эта команда также удаляет diff форматирование после того, как он получает правильные строки.)
diff -U $(wc -l < fileA) fileA fileB | sed -n 's/^-//p' > fileC