2013-03-18 4 views
10

С терминала unix мы можем использовать diff file1 file2, чтобы найти разницу между двумя файлами. Есть ли аналогичная команда, чтобы показать сходство в двух файлах? (Много труб допускаются при необходимостиКак найти повторяющиеся строки в двух разных файлах? Unix

Каждого файл содержит строку с струнным предложением, они сортируются и повторяющиеся строки удалены с sort file1 | uniq

file1:.. http://pastebin.com/taRcegVn

file2: http://pastebin.com/2fXeMrHQ

И на выходе должны выводиться строки, которые отображаются в обоих файлах.

output: http://pastebin.com/FnjXFshs

Я могу использовать Python, чтобы сделать это как таковой, но я думаю, что это слишком много, чтобы положить в терминал:

x = set([i.strip() for i in open('wn-rb.dic')]) 
y = set([i.strip() for i in open('wn-s.dic')]) 
z = x.intersection(y) 
outfile = open('reverse-diff.out') 
for i in z: 
    print>>outfile, i 
+0

Что ваши файлы выглядят как? – paulmelnikow

+3

Возможный дубликат [как показать общие строки (reverse diff)?] (Http://stackoverflow.com/questions/746458/how-to-show-lines-in-common-reverse-diff) – tjameson

+0

Большинство раз строка предложений человеческого языка. Иногда коллизируется с дополнительной информацией. – alvas

ответ

9

Как @tjameson упомянуто, что может быть решена в другом потоке. Просто хотел бы опубликовать еще одно решение: sort file1 file2 | awk 'dup[$0]++ == 1'

  1. сослаться на awk guide, чтобы получить некоторые AWK основы, когда значение шаблон строки верно эта линия будет печататься

  2. DUP [ $ 0] является хеш-таблицей, в которой каждый ключ является каждой строкой ввода, . Исходное значение равно 0 и увеличивается, как только эта строка возникает, когда происходит снова, значение должно быть 1, поэтому значение dup[$0]++ == 1 истинно. Затем эта строка печатается.

Обратите внимание, что это работает только в том случае, если в любом файле нет дубликатов, как указано в вопросе.

+0

Можете ли вы объяснить, как работает 'awk 'dup [$ 0] ++ == 1''?Ваше решение намного лучше, чем запутанное 'comm' – alvas

+0

@ 2er0 ответ обновлен – 2013-03-18 06:13:15

+1

' awk' использует 'pattern {action}' нотацию. Так как это не в фигурных скобках, это шаблон. '$ 0' - текущая строка. 'dup [$ 0]' - ассоциативный массив, проиндексированный линиями; при первом создании значение равно 0; 'dup [$ 0] ++' post-increments значение, поэтому он возвращает 0 в первый раз и 1 во второй раз и т. д. Когда его значение равно 1, условие истинно, поэтому действие по умолчанию (распечатать строку) выполняется. –

24

Если вы хотите, чтобы получить список повторяющихся линий, не прибегая к AWK, вы можете использовать -d flag to uniq:

sort file1 file2 | uniq -d 
+1

Для использования простейшего инструмента для достижения цели. –

+0

Кроме того, при отбрасывании -d вы получаете только все четкие строки из обоих файлов, которые я искал. – Aaron

Смежные вопросы