Как показать общие линии (обратный дифференциал)?
У меня есть серия текстовых файлов, для которых я хотел бы знать общие строки, а не строки, которые отличаются друг от друга. Командная строка 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)
спасибо.
Ответы
Ответ 1
В * nix вы можете использовать comm. Ответ на вопрос:
comm -1 -2 file1.sorted file2.sorted
# where file1 and file2 are sorted and piped into *.sorted
Здесь полное использование comm
:
comm [-1] [-2] [-3 ] file1 file2
-1 Suppress the output column of lines unique to file1.
-2 Suppress the output column of lines unique to file2.
-3 Suppress the output column of lines duplicated in file1 and file2.
Также обратите внимание, что важно сортировать файлы перед использованием comm, как указано в man-страницах.
Ответ 2
Здесь задавали вопрос: Команда Unix для поиска строк, общих в двух файлах
Вы также можете попробовать с perl (кредит идет здесь)
perl -ne 'print if ($seen{$_} .= @ARGV) =~ /10$/' file1 file2
Ответ 3
Нашел этот ответ на вопрос, указанный как дубликат. Я считаю grep более удобным для администратора, чем comm, поэтому, если вы просто хотите, чтобы набор совпадающих строк (например, полезно для сравнения CSV), просто используйте
grep -F -x -f file1 file2
или упрощенная версия fgrep
fgrep -xf file1 file2
Кроме того, вы можете использовать file2*
для glob и искать линии, общие для нескольких файлов, а не только для двух.
Некоторые другие удобные варианты включают
-
-n
, чтобы отобразить номер строки каждой согласованной строки
-
-c
, чтобы считать только количество строк, соответствующих
-
-v
для отображения только строк в файле2, которые отличаются (или используют diff
).
Использование comm
выполняется быстрее, но эта скорость происходит за счет необходимости сортировки файлов в первую очередь. Это не очень полезно, как "обратный diff".
Ответ 4
Я только что узнал команду comm из этого потока, но хотел добавить что-то еще: если файлы не отсортированы, и вы не хотите прикасаться к исходным файлам, вы можете передать outptut команды sort. Это оставляет исходные файлы неповрежденными. Работает в bash, я не могу сказать о других оболочках.
comm -1 -2 <(sort file1) <(sort file2)
Это может быть расширено для сравнения вывода команды, а не файлов:
comm -1 -2 <(ls /dir1 | sort) <(ls /dir2 | sort)
Ответ 5
Самый простой способ сделать это:
awk 'NR==FNR{a[$1]++;next} a[$1] ' file1 file2
Файлы не нужны для сортировки.
Ответ 6
Просто для информации, я сделал небольшой инструмент для Windows, делающий то же самое, что и "grep -F -x -f file1 file2" (так как я не нашел ничего эквивалентного этой команде в Windows)
Вот он:
http://www.nerdzcore.com/?page=commonlines
Использование "CommonLines inputFile1 inputFile2 outputFile"
Исходный код также доступен (GPL)