У меня есть ряд текстовых файлов, для которых я хотел бы знать общие линии, а не строки, которые отличаются между ними. Командная строка Unix или Windows в порядке.
Foo:
linux-vdso.so.1 => (0x00007fffccffe000)
libvlc.so.2 => /usr/lib/libvlc.so.2 (0x00007f0dc4b0b000)
libvlccore.so.0 => /usr/lib/libvlccore.so.0 (0x00007f0dc483f000)
libc.so.6 => /lib/libc.so.6 (0x00007f0dc44cd000)
бар:
libkdeui.so.5 => /usr/lib/libkdeui.so.5 (0x00007f716ae22000)
libkio.so.5 => /usr/lib/libkio.so.5 (0x00007f716a96d000)
linux-vdso.so.1 => (0x00007fffccffe000)
Таким образом, учитывая, что эти два файла выше, вывод желаемой утилиты будет сродни file1:line_number, file2:line_number == matching text
(просто предложение, мне действительно все равно, какой синтаксис):
foo:1, bar:3 == linux-vdso.so.1 => (0x00007fffccffe000)
Спасибо.
command-line
diff
Мэтт Уилки
источник
источник
Ответы:
На * nix вы можете использовать комм . Ответ на вопрос:
Вот полное использование
comm
:Также обратите внимание, что важно отсортировать файлы перед использованием comm, как упомянуто в справочных страницах.
источник
Нашел этот ответ на вопрос, указанный как дубликат . Я считаю, что grep более удобен для администратора, чем comm, поэтому, если вы просто хотите, чтобы набор совпадающих строк (например, был полезен для сравнения CSV), просто используйте
или упрощенная версия fgrep
Кроме того, вы можете использовать
file2*
для поиска и поиска строк общего с несколькими файлами, а не только два.Некоторые другие удобные варианты включают
-n
флаг для отображения номера строки каждой совпавшей строки-c
считать только количество совпадающих строк-v
отображать только те строки в файле2, которые отличаются (или используютdiff
).Использование
comm
быстрее, но эта скорость достигается за счет необходимости сначала сортировать файлы. Это не очень полезно в качестве «обратного сравнения».источник
-v
флага после того, как сам подскочил. Скажем, у вас есть два CSV-файла file1 и file2, и они имеют как перекрывающиеся, так и не перекрывающиеся строки. Если вы хотите, чтобы все и только неперекрывающиеся строки, использованиеfgrep -v file1 file2
вернет только непересекающиеся строки в file2 и ни одну из дополнительных непересекающихся строк в file1 . Это может быть очевидным для некоторых, но лучше заявить об очевидном, чем о неправильной интерпретации риска. В этом конкретном случае сортировка файлов и их использованиеcomm
по-прежнему является лучшим выбором.grep
: любая пустая строка в первом файле будет соответствовать каждой строке во втором файле. Убедитесь, что вfile1
нем нет пустых строк, иначе файлы будут выглядеть одинаково.grep -Fxf
это для меня.Здесь раньше спрашивали: команда Unix для поиска строк, общих в двух файлах
Вы также можете попробовать с Perl (кредит идет здесь )
источник
comm
не было легко доступно. Это была идеальная альтернатива.Я только что узнал команду comm из этого потока, но хотел добавить что-то дополнительное: если файлы не отсортированы, и вы не хотите трогать исходные файлы, вы можете передать выход команды sort. Это оставляет исходные файлы без изменений. Работает в bash, я не могу сказать о других оболочках.
Это может быть расширено для сравнения вывода команды вместо файлов:
источник
Самый простой способ сделать это:
Файлы не должны быть отсортированы.
источник
Просто для информации, я сделал небольшой инструмент для Windows, делающий то же самое, что и «grep -F -x -f file1 file2» (так как я не нашел ничего эквивалентного этой команде в Windows)
Вот оно: http://www.nerdzcore.com/?page=commonlines
Использование "CommonLines inputFile1 inputFile2 outputFile"
Исходный код также доступен (GPL)
источник
В Windows вы можете использовать скрипт Powershell с CompareObject
CompareObject:
источник