使用标识符号来标识和编辑行/字符串,然后将行/字符串附加到文件中的上一行

时间:2013-10-08 18:11:53

标签: sed awk append delimiter

使用标准的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

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

提前致谢!

2 个答案:

答案 0 :(得分: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"行是否包含@是设置s=","没有设置s="\n"(换行符)。

printf s"%s",$0使用$0作为格式打印s。如果行有@打印换行符,则为$0,如果不打印,,则为$0

答案 1 :(得分:1)

试试这个awk程序:

/^[:space:]*www\./ {
    if (f) {print line}
    f=1; line=$0; 
    next
}
f {
    line=(line "," $0)
}