1

使用标准的 linux 实用程序(我猜是 sed 和 awk)

抱歉标题含糊不清,我真的不知道如何更好地描述请求。一个更简单的方法是提供一个简单的例子。我有一个包含以下内容的文件:

      www.example.com
      johnsmith@gmail.com
      fredflintstone@gmail.com
      bettyboop@gmail.com
      www.example2.com
      kylejohnson@gmail.com
      www.example3.com
      chadbrown@gmail.com
      joshbeck@gmail.com
      www.example4.com
      tomtom@gmail.com
      jeffjeffries@gmail.com
      billnorman@gmail.com
      stankubrick@gmail.com
      andrewanders@gmail.com

所以,我想要做的是将以上内容转换为:

      www.example.com,johnsmith@gmail.com,fredflintstone@gmail.com,bettyboop@gmail.com
      www.example2.com,kylejohnson@gmail.com
      www.example3.com,chadbrown@gmail.com,joshbeck@gmail.com,
      www.example4.com,tomtom@gmail.com,jeffjeffries@gmail.com,billnorman@gmail.com,stankubrick@gmail.com,andrewanders@gmail.com

我认为最简单的做法是执行以下操作:如果该行包含“@”符号,则在行/字符串的开头输入一个逗号,然后将该行/字符串附加到前面线。有人有想法么?我认为,如果每个网站都有统一数量的电子邮件地址,那会更简单,但事实并非如此。

提前致谢!

4

2 回答 2

2

一个简单的方法

awk '{s=/@/?",":"\n";printf s"%s",$0}' file

www.example.com,johnsmith@gmail.com,fredflintstone@gmail.com,bettyboop@gmail.com
www.example2.com,kylejohnson@gmail.com
www.example3.com,chadbrown@gmail.com,joshbeck@gmail.com

s=/@/?",":"\n"行是否包含@yes set s=","no set s="\n"(换行符)。

printf s"%s",$0$0使用sas 格式打印。如果 line 有@print 换行符,那么$0,如果没有 print ,,那么$0

于 2013-10-08T19:07:21.100 回答
1

试试这个 awk 程序:

/^[:space:]*www\./ {
    if (f) {print line}
    f=1; line=$0; 
    next
}
f {
    line=(line "," $0)
}
于 2013-10-08T18:56:20.183 回答