【问题标题】:use identifying symbols to identify and edit line/string, then append line/string to previous line in file使用识别符号来识别和编辑行/字符串,然后将行/字符串附加到文件中的前一行
【发布时间】:2013-10-08 18:11:53
【问题描述】:

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

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

提前致谢!

【问题讨论】:

  • 我们可以相信总会有相当于 www.example*.com 的东西将您想要放在一行中的组分开吗?我会认为这个问题是'如果当前行没有@符号,我们开始创建一个新列表,将任何后续记录附加到当前行,直到我们找到没有@符号的下一行'。祝你好运!

标签: sed awk append delimiter


【解决方案1】:

一个简单的方法

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

【讨论】:

  • 这非常有效。现在我将不得不深入研究 awk 以找出原因。再次感谢!
【解决方案2】:

试试这个 awk 程序:

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

【讨论】:

  • 网址不需要包含www,但所有电子邮件都包含@
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-24
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
相关资源
最近更新 更多