LINUX.ORG.RU

Найти все совпадения из file1 в file2 [bash]

 ,


0

2

День добрый! Есть два файла в каждом из которых много строк. Необходимо для каждой строки в file1 найти совпадение в file2. Если совпадение не найдено, вывести данную строку. Не могу найти решение, помогите, плиз(( P.S. это вооще на bash можно сделать?


Если я правильно понял, тебе нужен diff.

shell-script ★★★★★
()

man grep:

-f FILE, --file=FILE
              Obtain patterns from FILE, one per line.  The empty file contains zero patterns, and therefore matches nothing.  (-f
              is specified by POSIX.)

leave ★★★★★
()
X="$(mktemp -t)"
cat file1 | sort | uniq > "$X"
cat file2 | sort | uniq | cat - "$X" | sort | uniq --unique
rm "$X"

Только не проверял.

proud_anon ★★★★★
()
Последнее исправление: proud_anon (всего исправлений: 1)
Ответ на: комментарий от leave

Строки, помимо символов для сранения (IP адреса) имеют лишние поля:

test$ cat file1
 rule 5 permit destination ip-address 192.168.0.1
 rule 10 permit destination ip-address 192.168.0.2
 rule 15 permit destination ip-address 192.168.0.3
 rule 20 permit destination ip-address 192.168.0.4
 rule 25 permit destination ip-address 192.168.0.5
 rule 30 permit destination ip-address 192.168.0.6
test$ cat file2
 rule 5 permit ip source ip-address 192.168.0.1 
 rule 10 permit ip source ip-address 192.168.0.5 
Сейчас делаю так:
cat file1 | grep -o -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' > temp_file1
cat file2 | grep -o -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' > temp_file2
grep -v -f temp_file2 temp_file1
Схема работает, хотел уточнить, так можно использовать, или есть более простые пути?

ehill
() автор топика
Ответ на: комментарий от ehill

есть более простые пути?

Ну, похоже на правду. Правда я бы
1. Если содержимое файлов именно такое как ты показал, выделял бы IPшник как «все символы после пробела до конца строки» - так регулярка проще получится, типа такого: '[^ ]*$'.
2. Сравнение все же делал бы diff

Но больших преимуществ у моего способа перед твоим нет.

Kroz ★★★★★
()
Ответ на: комментарий от ehill
grep_cmd=( grep -oE '([0-9]{1,3}\.){3}[0-9]{1,3}' )
"${grep_cmd[@]}" file1 | grep -vFf <("${grep_cmd[@]}" file2)

И да, "-F" нужно, иначе у тебя «1.1.1.1» совпадёт с «11.1.1.111».

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.