根据列值将多行合并为一条

时间:2019-01-31 12:48:05

标签: shell awk

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

$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

2 个答案:

答案 0 :(得分:1)

像这样吗?

$ 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,

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

答案 1 :(得分:1)

您只需要独立的awk

awk -F, 'BEGIN { OFS = FS }{ key = $1","$2 }{ unique[key] = unique[key]?(unique[key]"|"$3):($3) }
         END { for (i in unique) print i, unique[i] }' file

如果您认为最后需要额外的,,则在打印数组中的元素后,只需在","子句中添加END