【问题标题】:HOw to merge lines with awk to one line with same key如何将带有awk的行合并到具有相同键的一行
【发布时间】:2019-08-18 11:04:15
【问题描述】:

我有以下文件

 lion : catty : mouse
 lion : cat   : bear
 rubber: ham  : cheese

我想将每一行与键(= 第一个字段)合并到

lion : catty : mouse ; cat : bear
rubber: ham : cheese

我已经用这种方式用 awk 做到了,但它不起作用。

  #!/usr/bin/awk -f
  BEGIN {FS=":"} 
  a[$1]=a[$1] ";" $2 " : " $3
  END{
  for (x in a) print x,a[x]}

如果有 awk jack 能告诉我我做错了什么,我将不胜感激。 谢谢

【问题讨论】:

  • 您真的在每个输入行的开头以及某些:s 之前/之后都有空白字符吗?如果不是,请整理您的示例以反映现实,因为输入的外观显然对您解析该输入所需的工具有很大的影响。
  • 发布一个新问题并将这个问题链接到它。不要发布图像,发布具有预期输出的示例数据。
  • @JamesBrown 我已经这样做了,谢谢

标签: awk


【解决方案1】:

这可能是您正在寻找的:

$ awk -F' *: *' -v OFS=' : ' '{a[$1] = ($1 in a ? a[$1] " ; " : "") $2 OFS $3} END{for (key in a) print key, a[key]}' file
rubber : ham : cheese
lion : catty : mouse ; cat : bear

【讨论】:

  • 谢谢,它在命令行上作为单行程序工作。但是当我把它写成脚本时,我得到syntax error at the for (x in a) 为什么?
  • 我猜你在复制/粘贴时引入了语法错误?没有看到我能做的最好的代码来帮助调试代码。
  • 我发现脚本中的 END 必须在 { - 现在它也可以用作 awk 脚本。非常感谢
【解决方案2】:

试试:

$ awk -F: '{a[$1]=a[$1] (a[$1]?";":":") $2":" $3} END{for (x in a) print x,a[x]}' file
  lion  : catty : mouse; cat   : bear
  rubber : ham  : cheese

如果你想要更漂亮的输出,试试:

$ awk -F: '{a[$1]=a[$1] (a[$1]?" ; ":" : ") $2" : " $3} END{for (x in a) print x,a[x]}' file | column -t
lion    :  catty  :  mouse   ;  cat  :  bear
rubber  :  ham    :  cheese

【讨论】:

    猜你喜欢
    • 2019-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-23
    • 1970-01-01
    • 2020-09-18
    • 2020-05-13
    相关资源
    最近更新 更多