Есть два файла с именами «a.txt» и «b.txt», оба имеют список слов. Теперь я хочу проверить, какие слова являются дополнительными в «a.txt» и не находятся в «b.txt» .
Мне нужен эффективный алгоритм, так как мне нужно сравнить два словаря.
linux
terminal
diff
file-comparison
Али Имран
источник
источник
diff a.txt b.txt
недостаточно?Ответы:
если у вас установлен vim, попробуйте это:
или
Вы найдете это фантастическим.
источник
Сортируйте их и используйте
comm
:comm
сравнивает (сортирует) входные файлы и по умолчанию выводит три столбца: строки, уникальные для a, строки, уникальные для b, и строки, присутствующие в обоих. Указав-1
,-2
и / или-3
вы можете подавить соответствующий вывод. Поэтомуcomm -23 a b
перечислены только записи, которые являются уникальными для. Я использую<(...)
синтаксис для сортировки файлов на лету, если они уже отсортированы, вам это не нужно.источник
comm
более эффективен, потому что он выполняет работу за один запуск, не сохраняя весь файл в памяти. Поскольку вы используете словари, которые, скорее всего, уже отсортированы, они вам даже не нужныsort
. Использованиеgrep -f file1 file2
с другой стороны загрузит всеfile1
в память и сравнит каждую строкуfile2
со всеми этими записями, что гораздо менее эффективно. Это в основном полезно для маленьких, несортированных-f file1
.\n
он также будет включен для сравнения.Попробуйте
sdiff
(man sdiff
)источник
Вы можете использовать
diff
инструмент в Linux, чтобы сравнить два файла. Вы можете использовать параметры --changed-group-format и --unchanged-group-format для фильтрации необходимых данных.Следующие три параметра можно использовать для выбора соответствующей группы для каждого параметра:
'% <' получить строки из FILE1
'%>' получить строки из FILE2
'' (пустая строка) для удаления строк из обоих файлов.
источник
Если вы предпочитаете стиль вывода diff из
git diff
, вы можете использовать его с--no-index
флагом, чтобы сравнивать файлы не в git-репозитории:Используя пару файлов с примерно 200-тысячными строками имен в каждой, я сравнил (с помощью встроенной
time
команды) этот подход по сравнению с некоторыми другими ответами здесь:comm
кажется самым быстрым на сегодняшний день, в то время какgit diff --no-index
кажется самым быстрым подходом для вывода в стиле diff.Обновление 2018-03-25 Вы можете на самом деле опустить
--no-index
флаг, если вы не находитесь в репозитории git и не хотите сравнивать неотслеживаемые файлы в этом репозитории. Из справочных страниц :источник
Вы также можете использовать: colordiff : отображает вывод diff с цветами.
О vimdiff : позволяет сравнивать файлы через SSH, например:
Извлечено из: http://www.sysadmit.com/2016/05/linux-diferencias-entre-dos-archivos.html
источник
Также не стоит забывать и про mcdiff - внутреннюю программу просмотра различий в GNU Midnight Commander .
Например:
Наслаждайтесь!
источник
Использование
comm -13
(требуется отсортированные файлы) :источник
Вот мое решение для этого:
источник
sdiff -s file1 file2
было полезно.Используя awk для этого. Тестовые файлы:
Awk:
Дубликаты выдаются:
Чтобы избежать дубликатов, добавьте каждое вновь встреченное слово в a.txt в
seen
хеш:Вывод:
Если списки слов разделены запятыми, например:
Вы должны сделать пару дополнительных кругов (
for
петель):На этот раз выведите:
источник