2016-08-17 55 views
1

我有一个相当不整洁的CSV文件作为字段分隔符;。在字段1中,我有一个名称,在字段3或4中有地址详细信息,用逗号分隔,其中包含一个未指定数量的条目,主要包括一个电子邮件地址。所以它看起来像这样:使用awk里面的grep

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] 

但我不知道如何可以从awk调用grep。

+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)将有助于我们在两种方式比赛功能将只有在正则表达式捕获mail地址,然后我们进入打印部分来展示最终结果。