У меня есть файл как ниже:
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
То, в чем я нуждаюсь, ниже формата:
Mark,chess,tennis
Tom,swimming,badminton,badminton,boxing,music
Nick,swimming
fabio,swimming,badminton,badminton,boxing,music
Я попробовал "TR", в то время как, но не способный выяснить корректную логику из-за дублирующихся названий строк. Можете Вы совет?
Выполнение того же как Oli, предложенный с sh вместо awk:
#!/bin/sh
IFS=:
while read key value; do
if [ "$key" = "Personname" ]; then
printf "\n%s" $value
else
printf ",%s" $value
fi
done < data
Можно сделать это справедливо тривиально с awk
. Это просто смотрит на каждую строку самостоятельно. Если это - имя, мы всовываем новую строку и печатаем имя, если это не, мы всовываем запятую (без новой строки) и печатаем хобби.
$ awk -F: '$1=="Personname" {printf("\n%s", $2)} $1=="Hobby" {printf(",%s", $2)}' data
Mark,chess,tennis
Tom,swimming,badminton,boxing,music
Nick,swimming
fabio,swimming,badminton,boxing,music
предложение KasiyA в комментариях передвигает логику для использования троичного условия решить что строку записать. Это аккуратно, но я явно проверил бы, что мы смотрели на строку Personname или Hobby и не пустую или не Хобби под названием Personname. Что-то вроде этого должно сделать это:
awk -F: '{printf $1=="Personname" ? "\n"$2 : $1=="Hobby" ? ","$2 : ""}' data