在awk中使用grep

时间:2016-08-17 15:43:00

标签: bash awk grep

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

Doe, Jon; Some information ; some more information; di: address details, p: (01234) 56789, F: 252470, info@my-domain.com    
Miller, Mariella; Some information ; di: other address, p: (09876) 54321, mailme@the-millers.com    
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._%+-]\+@[A-Z0-9.-]\+\.[A-Z]\{2,4\}" mylist.csv

我希望在行中有@时调用grep,从而产生如下输出:

Doe, Jon, info@my-domain.com
Miller, Mariella, mailme@the-millers.com

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

2 个答案:

答案 0 :(得分:2)

您可以使用gawk

$ gawk -F\; 'match($0, /(\w+@[^@]+.)/, a){print $1", "a[1]}' file
Doe, Jon, info@my-domain.com    
Miller, Mariella, mailme@the-millers.com

来自documentation

  

如果regexp包含括号,则为数组的整数索引元素   被设置为包含匹配对应的字符串部分   带括号的子表达式。

<强>解释

match($0, /(\w+@[^@]+.)/, a)将以两种方式为我们提供匹配功能只有在正则表达式 em>捕获邮件地址,然后我们进入 print 部分以显示最终结果。

答案 1 :(得分:0)

使用awk你可以这样做:

awk -F ';' '$NF ~ /@/{sub(/ *$/, "", $NF); sub(/.* /, "", $NF); print $1 ",", $NF}' file

Doe, Jon, info@my-domain.com
Miller, Mariella, mailme@the-millers.com