如何将具有awk的行合并到具有相同键的行

如何将具有awk的行合并到具有相同键的行,awk,Awk,我有以下文件 lion : catty : mouse lion : 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]} 如果有人能告诉我我做错了什么,我将不胜感激。 谢谢试试: $ a

我有以下文件

 lion : catty : mouse
 lion : 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 -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

这可能是您正在寻找的:

$ 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

您真的在每个输入行的开头和一些
之前/之后有空白字符吗?如果没有,请整理您的示例以反映实际情况,因为输入的外观显然会对您解析该输入所需的工具产生重大影响。发布一个新问题并将此问题链接到它。不要发布图像,发布具有预期输出的示例数据。@JamesBrown我已经这样做了,谢谢,它在命令行中作为一个单行程序工作。但是,当我将其作为脚本编写时,在for(a中的x)处会出现
语法错误
为什么?我猜您在复制/粘贴它时引入了语法错误?在没有看到代码的情况下,这是我能够帮助调试代码的最好方法。我发现脚本的结尾必须在{之前-现在它也可以作为awk脚本工作。非常感谢
$ 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