Страницы

Поиск по вопросам

вторник, 28 января 2020 г.

Выборка строк из файлов

#bash


Господа, есть ли быстрый способ выбрать строки, которые дублируются в 2-х файлах?Напиример:file1.txtMariaFeudorIvanNikolayfile2.txtDmitryElenaAntonMariaEvgenyIvanНа
выходе нужно получитьMariaIvanКакое либо компактное и быстрое решение, может быть можно
через diff?    


Ответы

Ответ 1



awk пробежит по каждой строке первого файла, отыскивая её с помощью grep во втором.Upd. Не понимаю, почему каждая стрка выводится дважды. Гуру шелла, хелп! Как-то так:cat file1.txt | awk '/^.+$/ { "grep "$0" file2.txt" | getline cmdout; print cmdout}'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.

Ответ 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

Комментариев нет:

Отправить комментарий