Первый элемент ответа (когда размер был установлен на 3 и некрасивое решение ):
awk 'BEGIN{FS=OFS="|"; print "col1|col2|col3-1|col3-2|col3-3|col4|col5-1|col5-2|col5-3|col6"}NR>1{col2[$1]=$2;col4[$1]=$4;col6[$1]=$6;if(length(col3[$1])==0){col3[$1]=$3}else{col3[$1]=col3[$1]"|"$3}if(length(col5[$1])==0){col5[$1]=$5}else{col5[$1]=col5[$1]"|"$5}}END{n=asorti(col3,oArray);for(i=1; i<=n;i++){if(index(col3[oArray[i]],"|")==0){col3[oArray[i]]=col3[oArray[i]]"||";col5[oArray[i]]=col5[oArray[i]]"||";};print oArray[i],col2[oArray[i]],col3[oArray[i]],col4[oArray[i]],col5[oArray[i]],col6[oArray[i]]}}' csvToMerge.in
col1|col2|col3-1|col3-2|col3-3|col4|col5-1|col5-2|col5-3|col6
id1|2314|jack|jill|jim|nov-12|water|oil|ether|3294
id2|8322|john|||dec-01|sand|||2334
id3|6775|mike|||jan-13|dust|||9348
более читабельно:
$ cat awkprof.out
# gawk profile, created Fri Dec 14 13:12:34 2018
# BEGIN rule(s)
BEGIN {
1 FS = OFS = "|"
1 print "col1|col2|col3-1|col3-2|col3-3|col4|col5-1|col5-2|col5-3|col6"
}
# Rule(s)
6 NR > 1 { # 5
5 col2[$1] = $2
5 col4[$1] = $4
5 col6[$1] = $6
5 if (length(col3[$1]) == 0) { # 3
3 col3[$1] = $3
2 } else {
2 col3[$1] = col3[$1] "|" $3
}
5 if (length(col5[$1]) == 0) { # 3
3 col5[$1] = $5
2 } else {
2 col5[$1] = col5[$1] "|" $5
}
}
# END rule(s)
END {
1 n = asorti(col3, oArray)
3 for (i = 1; i <= n; i++) {
3 if (index(col3[oArray[i]], "|") == 0) { # 2
2 col3[oArray[i]] = col3[oArray[i]] "||"
2 col5[oArray[i]] = col5[oArray[i]] "||"
}
3 print oArray[i], col2[oArray[i]], col3[oArray[i]], col4[oArray[i]], col5[oArray[i]], col6[oArray[i]]
}
}
BEAUTIFULLРЕШЕНИЕ
Динамическое построение col3
и col5
путем вычисления максимального количества идентичных вхождений элементов из col1
script csvmerge.awk
#function definitions
#function used to add the "|" at the end of col3, col5 when the element does not reach MAX number of occurences
function paddingfunction(MAX,input){
output=input;
gsub(/[^|]/,"",output);
l=length(output);
tmp=""
for(u=l; u<MAX-1;u++)
{
tmp=tmp OFS;
}
return input""tmp;
}
#function used to generate nice header
function headerAppender(inputString){
tmp=inputString;
for(i=1;i<=MAX;i++){
printf tmp""i OFS
}
}
BEGIN{
#Generate the header line
FS=OFS="|";
printf "col1" OFS "col2" OFS;
headerAppender("col3-");
printf "col4" OFS; headerAppender("col5-");
print "col6"
}
NR>1{
#save all the cells and concat the cells when col1 is the same
col2[$1]=$2;
col4[$1]=$4;
col6[$1]=$6;
if(length(col3[$1])==0){
col3[$1]=$3
}
else{
col3[$1]=col3[$1] OFS $3
}
if(length(col5[$1])==0){
col5[$1]=$5
}
else{
col5[$1]=col5[$1] OFS $5
}
}
END{
#sort the array
n=asorti(col3,oArray);
#print the cells
for(i=1; i<=n;i++){
print oArray[i],col2[oArray[i]],paddingfunction(MAX,col3[oArray[i]]),col4[oArray[i]],paddingfunction(MAX,col5[oArray[i]]),col6[oArray[i]];
}
}
input1: (6 элементов в группе)
$ cat csvToMerge.in
col1|col2|col3|col4|col5|col6
id1|2314|jack|nov-12|water|3294
id2|8322|john|dec-01|sand|2334
id1|2314|jill|nov-12|oil|3294
id1|2314|jim|nov-12|ether|3294
id3|6775|mike|jan-13|dust|9348
id4|6776|mik1|jan-14|dast|9344
id4|6776|mik2|jan-14|dest|9344
id4|6776|mik3|jan-14|dist|9344
id4|6776|mik4|jan-14|dost|9344
id4|6776|mik5|jan-14|dst|9344
id4|6776|mik6|jan-14|dut|9344
input2: (5 элементов в группе)
$ cat csvToMerge2.in
col1|col2|col3|col4|col5|col6
id1|2314|jack|nov-12|water|3294
id2|8322|john|dec-01|sand|2334
id1|2314|jill|nov-12|oil|3294
id1|2314|jim|nov-12|ether|3294
id3|6775|mike|jan-13|dust|9348
id4|6776|mik1|jan-14|dast|9344
id4|6776|mik2|jan-14|dest|9344
id4|6776|mik3|jan-14|dist|9344
id4|6776|mik4|jan-14|dost|9344
id4|6776|mik5|jan-14|dst|9344
вывод 1:
$ awk -f csvmerge.awk -v MAX=`awk -F'|' ' {tot[$1]++}END{tmp=""; for (i in tot){if(tot[i]>tmp){tmp=tot[i]}}; print tmp; } ' csvToMerge.in` csvToMerge.in
col1|col2|col3-1|col3-2|col3-3|col3-4|col3-5|col3-6|col4|col5-1|col5-2|col5-3|col5-4|col5-5|col5-6|col6
id1|2314|jack|jill|jim||||nov-12|water|oil|ether||||3294
id2|8322|john||||||dec-01|sand||||||2334
id3|6775|mike||||||jan-13|dust||||||9348
id4|6776|mik1|mik2|mik3|mik4|mik5|mik6|jan-14|dast|dest|dist|dost|dst|dut|9344
вывод 2:
$ awk -f csvmerge.awk -v MAX=`awk -F'|' ' {tot[$1]++}END{tmp=""; for (i in tot){if(tot[i]>tmp){tmp=tot[i]}}; print tmp; } ' csvToMerge2.in` csvToMerge2.in
col1|col2|col3-1|col3-2|col3-3|col3-4|col3-5|col4|col5-1|col5-2|col5-3|col5-4|col5-5|col6
id1|2314|jack|jill|jim|||nov-12|water|oil|ether|||3294
id2|8322|john|||||dec-01|sand|||||2334
id3|6775|mike|||||jan-13|dust|||||9348
id4|6776|mik1|mik2|mik3|mik4|mik5|jan-14|dast|dest|dist|dost|dst|9344
Примечания:
-v MAX=`awk -F'|' ' {tot[$1]++}END{tmp=""; for (i in tot){if(tot[i]>tmp){tmp=tot[i]}}; print tmp; } ' csvToMerge.in`
Сохранение в переменнойMAX
максимальное количество вхождений в группу, в вашем случае макс. 5, но вы можете представить себе другие ситуации, когда вам нужно сгруппировать больше элементов.