#bash
Господа, есть ли быстрый способ выбрать строки, которые дублируются в 2-х файлах?Напиример:file1.txtMariaFeudorIvanNikolayfile2.txtDmitryElenaAntonMariaEvgenyIvanНа выходе нужно получитьMariaIvanКакое либо компактное и быстрое решение, может быть можно через diff?
Ответы
Ответ 1
awk пробежит по каждой строке первого файла, отыскивая её с помощью grep во втором.Upd. Не понимаю, почему каждая стрка выводится дважды. Гуру шелла, хелп! Как-то так:Upd. 2: Вот работающее решение. Спасибо @Dmitry_Chubarov за фикс с дублями.cat file1.txt | awk {' "grep "$0" file2.txt" | getline cmdout; if ( cmdout != "" )print cmdout ; cmdout=""; '}Upd. 3: неимоверно усложнил я, конечно. Верный ответ см. от @dik-m: все решается одним grep с ключем -f.cat file1.txt | awk '/^.+$/ { "grep "$0" file2.txt" | getline cmdout; print cmdout}'Ответ 2
Вы можете использовать команду join. Поставленную задачу она замечательно решает, хотя может больше.join file1.txt file2.txtКоманда выдаст предупреждение о том, что следует предварительно отсортировать файлы и строки, встречающиеся в обеих фалах:~> join file1.txt file2.txt join: file 2 is not in sorted orderjoin: file 1 is not in sorted orderMariaIvanДополнение (по совету PocketSam): Файлы можно отсортировать командой sort. Следующая строчка сортирует один из файлов, выполняет слияние и удаляет временный файл.:~> FILE2=$( mktemp ) && sort file2.txt > $FILE2 && \sort file1.txt | join - $FILE2 && rm $FILE2выводит:IvanMariaОтвет 3
Утилита comm[s@pandora6 /tmp]$ cat _file1.txtFeudorIvanMariaNikolay[s@pandora6 /tmp]$ cat _file2.txtAntonDmitryElenaEvgenyIvanMaria[s@pandora6 /tmp]$ comm -1 -2 _file1.txt _file2.txtIvanMariaОтвет 4
По моему всё на много проще:такgrep -f file1.txt file2.txtили такgrep -f file2.txt file1.txtрезультат одинаковIvanMariaОтвет 5
$ comm --help Usage: comm [OPTION]... FILE1 FILE2 Compare sorted files FILE1 and FILE2 line by line. $ cat file* 123 456 789 123 456 789 987 $ ls file* file1 file2 $ comm -12 file1 file2 123 456 789
Комментариев нет:
Отправить комментарий