bash classificando várias cadeias duplicadas em um arquivo

1

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?

    
por user261334 06.02.2015 / 11:16

2 respostas

3

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
    
por Florian Diesch 06.02.2015 / 11:30
1

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
    
por Oli 06.02.2015 / 11:25