удар, сортирующий несколько дубликатов, представляет в виде строки в файле

У меня есть файл как ниже:

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", в то время как, но не способный выяснить корректную логику из-за дублирующихся названий строк. Можете Вы совет?

1
задан 6 February 2015 в 03:28

2 ответа

Выполнение того же как 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
3
ответ дан 10 November 2019 в 08:42

Можно сделать это справедливо тривиально с 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
1
ответ дан 10 November 2019 в 08:42

Другие вопросы по тегам:

Похожие вопросы: