2016-08-17 2 views
1

У меня довольно неряшливый CSV-файл с ; как разделитель полей. В поле 1 у меня есть имя, а в поле 3 ИЛИ 4 есть данные адреса, разделенные запятой, с неуказанным количеством записей, в основном включая адрес электронной почты. Итак, это выглядит так:Использование grep внутри awk

Doe, Jon; Some information ; some more information; di: address details, p: () 56789, F: 252470, [email protected]  
Miller, Mariella; Some information ; di: other address, p: (09876) 54321, [email protected]  
Brown, Sam; Other information ; di: other address with no e-mail, p: (09876) 54321 

Я хочу извлечь адреса электронной почты из файла вместе с именами. Я могу получить имена с

BEGIN {FS = ";"} 
/@/ {print $1} 

можно найти в электронной почте адреса с этой милой Grep:

grep -i -o "[A-Z0-9._%+-]\[email protected][A-Z0-9.-]\+\.[A-Z]\{2,4\}" mylist.csv 

Я хотел бы иметь Grep вызывается, когда есть в строке @ , что приводит к выходу, как это:

Doe, Jon, [email protected] 
Miller, Mariella, [email protected] 

Но я понятия не имею, как я могу называть Grep из AWK.

+0

'awk' может сделать буквально все' grep' может. Нет смысла использовать внешний инструмент. –

ответ

2

Вы можете использовать gawk:

$ gawk -F\; 'match($0, /(\[email protected][^@]+.)/, a){print $1", "a[1]}' file 
Doe, Jon, [email protected]  
Miller, Mariella, [email protected] 

Из documentation:

Если регулярное выражение содержит круглые скобки, целые индексированные элементы массива установлены, чтобы содержать часть строки, соответствующую соответствующей подвыражение в скобках.

Объяснение

match($0, /(\[email protected][^@]+.)/, a) будет служить нам в двух способов, спичечных функции будет верно только если регулярного выражения захватывает почтовый адрес, то введите печать чтобы показать окончательный результат.

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