我有一个包含以下记录的文件。
$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
答案 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
。