LINUX.ORG.RU

Использование grep в циклах

 , ,


0

1

Здравствуйте!

Подскажите, пожалуйста.

Задача следующая:

Есть 2 файла

$ cat emails
masyuk_aa@mail.ru
derector@mail.ru
saharova@mail.ru
kulekov@mail.ru
kusnetsova@mail.ru
horev@mail.ru
popova@mail.ru
suslekov_aa@mail.ru
selleng@mail.ru
oreshken_sv@mail.ru
evanov_v@mail.ru
ohrana@mail.ru
shvets@mail.ru
neroda@mail.ru
pruglo@mail.ru
logest_rk@mail.ru
buhgalter@mail.ru
nekulechev_sy@mail.ru
lomaken@mail.ru
pugovken@mail.ru
pushkarskey@mail.ru
admen@mail.ru
prorab@mail.ru
mehanek@mail.ru
nekolaev@mail.ru
proshken@mail.ru
barmashov@mail.ru
savgar@mail.ru
ushnov@mail.ru
aksenov@mail.ru
gordeeva_tv@mail.ru
derector@mail.ru
saharova@mail.ru
kusnetsova@mail.ru
kulekov@mail.ru
horev@mail.ru

$ cat emails_ids
horev@mail.ru 9945c8b5b3
masyuk_aa@mail.ru 35825288ba
derector@mail.ru df28e0e1fb
saharova@mail.ru 00d78e407a
kulekov@mail.ru 7703a6b43d
kusnetsova@mail.ru 68d2effaf0
horev@mail.ru 3362a2c90f
popova@mail.ru 5e77ce467c
suslekov_aa@mail.ru f5c127e113
selleng@mail.ru 1a7207b1c4
oreshken_sv@mail.ru d07f81d523
evanov_v@mail.ru e0bb9b49cb
ohrana@mail.ru 585bc8458b
shvets@mail.ru 61e33fe58c
neroda@mail.ru b273baea40
pruglo@mail.ru 192b92ad3b
logest_rk@mail.ru c2b9c591b3
buhgalter@mail.ru 28cae38649
nekulechev_sy@mail.ru e32bafb6eb
lomaken@mail.ru 5595564d79
pugovken@mail.ru 8f7def814e
pushkarskey@mail.ru 3c2027fd35
admen@mail.ru b023fb4451
prorab@mail.ru 69baa799dc
mehanek@mail.ru 276e046e3c
nekolaev@mail.ru ecd935431b
proshken@mail.ru 6f9ed54b35
barmashov@mail.ru 892f9e9f25
savgar@mail.ru 8b5134fe9c
ushnov@mail.ru e86efd116d
aksenov@mail.ru 25565c327b
gordeeva_tv@mail.ru 13d8c3b426
derector@mail.ru 845aadd0b9
saharova@mail.ru 062d231874
kusnetsova@mail.ru c8c6401fd5
kulekov@mail.ru 83121a49fd
horev@mail.ru 43e539216a
horev@mail.ru c8b5buw233
masyuk_aa@mail.ru sa358258ba
derector@mail.ru s778e0e1fb
saharova@mail.ru 00d78e407a
kulekov@mail.ru 7703a6b43d

В обоих файлах есть по несколько вхождений email. Нужно вывести в цикле первый id из файла emails_ids (если идти по списку сверху вниз) для каждого email из файла emails.

В цикле можно вывести каждый email:

$ for i in `cat emails`; do echo "$i"; done
masyuk_aa@mail.ru
derector@mail.ru
saharova@mail.ru
kulekov@mail.ru
kusnetsova@mail.ru
horev@mail.ru
popova@mail.ru
suslekov_aa@mail.ru
selleng@mail.ru
oreshken_sv@mail.ru
evanov_v@mail.ru
ohrana@mail.ru
shvets@mail.ru
neroda@mail.ru
pruglo@mail.ru
logest_rk@mail.ru
buhgalter@mail.ru
nekulechev_sy@mail.ru
lomaken@mail.ru
pugovken@mail.ru
pushkarskey@mail.ru
admen@mail.ru
prorab@mail.ru
mehanek@mail.ru
nekolaev@mail.ru
proshken@mail.ru
barmashov@mail.ru
savgar@mail.ru
ushnov@mail.ru
aksenov@mail.ru
gordeeva_tv@mail.ru
derector@mail.ru
saharova@mail.ru
kusnetsova@mail.ru
kulekov@mail.ru
horev@mail.ru

И это работает, но если попробовать grep’ать в цикле, то получаю такой результат:

$ for i in `cat emails`; do grep "$i" emails_ids|awk '{print $2}'|head -1; done
grep: Unmatched [, [^, [:, [., or [=
grep: Unmatched [, [^, [:, [., or [=
grep: Unmatched [, [^, [:, [., or [=
grep: Unmatched [, [^, [:, [., or [=
grep: Unmatched [, [^, [:, [., or [=
grep: Unmatched [, [^, [:, [., or [=
grep: Unmatched [, [^, [:, [., or [=
grep: Unmatched [, [^, [:, [., or [=
grep: Unmatched [, [^, [:, [., or [=
grep: Unmatched [, [^, [:, [., or [=
grep: Unmatched [, [^, [:, [., or [=
grep: Unmatched [, [^, [:, [., or [=
grep: Unmatched [, [^, [:, [., or [=
grep: Unmatched [, [^, [:, [., or [=
grep: Unmatched [, [^, [:, [., or [=
grep: Unmatched [, [^, [:, [., or [=
grep: Unmatched [, [^, [:, [., or [=
grep: Unmatched [, [^, [:, [., or [=
grep: Unmatched [, [^, [:, [., or [=
grep: Unmatched [, [^, [:, [., or [=
grep: Unmatched [, [^, [:, [., or [=
grep: Unmatched [, [^, [:, [., or [=
grep: Unmatched [, [^, [:, [., or [=
grep: Unmatched [, [^, [:, [., or [=
grep: Unmatched [, [^, [:, [., or [=
grep: Unmatched [, [^, [:, [., or [=
grep: Unmatched [, [^, [:, [., or [=
grep: Unmatched [, [^, [:, [., or [=
grep: Unmatched [, [^, [:, [., or [=
grep: Unmatched [, [^, [:, [., or [=
grep: Unmatched [, [^, [:, [., or [=
grep: Unmatched [, [^, [:, [., or [=
grep: Unmatched [, [^, [:, [., or [=
grep: Unmatched [, [^, [:, [., or [=
grep: Unmatched [, [^, [:, [., or [=
grep: Unmatched [, [^, [:, [., or [=

Не совсем понимаю, из-за чего так происходит и как правильно реализовать? Спасибо!

Вроде работает

Создал файлы с твоими данными.

Выдало:

35825288ba
df28e0e1fb
00d78e407a
7703a6b43d
68d2effaf0
9945c8b5b3
5e77ce467c
f5c127e113
1a7207b1c4
d07f81d523
e0bb9b49cb
585bc8458b
61e33fe58c
b273baea40
192b92ad3b
c2b9c591b3
28cae38649
e32bafb6eb
5595564d79
8f7def814e
3c2027fd35
b023fb4451
69baa799dc
276e046e3c
ecd935431b
6f9ed54b35
892f9e9f25
8b5134fe9c
e86efd116d
25565c327b
13d8c3b426
df28e0e1fb
00d78e407a
68d2effaf0
7703a6b43d
9945c8b5b3
wandrien ★★
()
Последнее исправление: wandrien (всего исправлений: 1)
Ответ на: комментарий от alex2020

Проверил на другом дистре. Действительно работает. Видимо, какие-то особенности используемой системы.

alex2020
() автор топика

К спрашиваемой проблеме отношения наверно не имеет, но как всегда неумение пользоваться grep-ом. Чтобы найти строку, надо не лениться дописывать ключ -F. grep без -F ищет регэкспы. А ещё у кого-то почта может с минуса начинаться, тоже будут проблемы. Правильно: grep -F -- "$i" emails_ids

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)

Не совсем понимаю, из-за чего так происходит

Есть стандартная процедура — сделать отладочную печать, на первый взгляд этот ваш ужас всё же «работать» будет.

и как правильно реализовать?

Ну то что вы придумали — в принципе никуда не годится, хоть по каждой букве, начиная с `cat file` и grep|awk и на каждую строчку входных данных... Такие задачи решаются ассоциативными массивами.

vodz ★★★★★
()

Это все делается одним awk

загоняй первый файл в hash (ассоциативный массив), потом проходись по второму файлу.

futurama ★★★★★
()

Ошибка была в том, что список email был в цветном виде, из-за спецсимволов при grep’e возникали ошибки.

Обратил внимание на это не сразу.

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