Fazendo o mesmo que Oli sugeriu com sh ao invés de awk:
#!/bin/sh
IFS=:
while read key value; do
if [ "$key" = "Personname" ]; then
printf "\n%s" $value
else
printf ",%s" $value
fi
done < data
Eu tenho o arquivo abaixo:
Personname:Mark
Hobby:chess
Hobby:tennis
Personname:Tom
Hobby:swimming
Hobby:badminton
Hobby:boxing
Hobby:music
Personname:Nick
Hobby:swimming
Personname:fabio
Hobby:swimming
Hobby:badminton
Hobby:boxing
Hobby:music
O que eu preciso está abaixo do formato:
Mark,chess,tennis
Tom,swimming,badminton,badminton,boxing,music
Nick,swimming
fabio,swimming,badminton,badminton,boxing,music
Eu tentei com "tr", mas não consegui descobrir a lógica correta devido a nomes duplicados de strings. Você pode me aconselhar?
Fazendo o mesmo que Oli sugeriu com sh ao invés de awk:
#!/bin/sh
IFS=:
while read key value; do
if [ "$key" = "Personname" ]; then
printf "\n%s" $value
else
printf ",%s" $value
fi
done < data
Você pode fazer isso de forma bastante trivial com um awk
. Isso só olha para cada linha por conta própria. Se é um nome, colocamos uma nova linha e imprimimos o nome, se não for, colocamos uma vírgula (sem uma nova linha) e imprimimos o hobby.
$ awk -F: '=="Personname" {printf("\n%s", )} =="Hobby" {printf(",%s", )}' data
Mark,chess,tennis
Tom,swimming,badminton,boxing,music
Nick,swimming
fabio,swimming,badminton,boxing,music
A sugestão de KasiyA nos comentários muda a lógica para usar uma condição ternária para decidir qual string escrever. É legal, mas eu explicitamente verifiquei que estávamos olhando para uma linha Personname ou Hobby e não uma em branco ou não um Hobby chamado Personname. Algo como isso deve fazer isso:
awk -F: '{printf =="Personname" ? "\n" : =="Hobby" ? "," : ""}' data