首页 > 解决方案 > 根据列值将多行组合成单行

问题描述

我有一个包含以下记录的文件。

$File.txt
APPLE,A,10
APPLE,A,20
APPLE,A,30
GRAPE,B,12
GRAPE,B,13

我希望输出如下所示:

  APPLE,A,10|20|30,
  GRAPE,B,12|13,

我尝试了以下方法并获得了所需的输出。但寻找更简单的东西。

awk -F"," '{if(NR<2){if(!seen[$1]++){printf "%-8s|",$3}}else{if(seen[$1]++){printf "%-12s|",$3}else{ printf ",\n%-12s|",$3}}}' File1.txt  | awk -F"|" '{for(i=1;i<NF-1;i++){ printf "%-12s|",$i}printf "%-12s,\n", $(NF-1)}'|sed 's/ //g' > O1.txt
awk -F"," '{print $1","$2","}' File1.txt | uniq > O2.txt
paste -d'\0' O2.txt O1.txt

标签: shellawk

解决方案


像这样的东西?

$ awk -F, '{k=$1 FS $2; a[k]=((k in a)?a[k]"|":k FS)$3} 
       END {for(k in a) print a[k] FS}' file

APPLE,A,10|20|30,
GRAPE,B,12|13,

要删除最后一个逗号,请删除FSin print 语句。如果您的文件已经排序,则可以进一步简化。


推荐阅读