transpose / pivot csv text file

3

Eu preciso transpor / dinamizar um arquivo CSV. Não sei se isso é possível

Suponha que este conteúdo do arquivo CSV:

filename;rating;id;summary
S4348gjO.doc;good;0001;describing how to reach your goals
S4348gjO.doc;good;0002;some recipes for avoiding an argument
S4348gjO.doc;bad;0003;boring part of the page
A234HK.doc;fairly good;0001;how to deploy a server
A234HK.doc;bad;0002;start and stop the server

A saída deve ser:

filename;good;fairly good;bad;id
S4348gjO.doc;describing how to reach your goals; ; ;0001
S4348gjO.doc;some recipes for avoiding an argument; ; ;0002
S4348gjO.doc; ; ;boring part of the page;0003
A234HK.doc; ;how to deploy a server; ;0001
A234HK.doc; ; ;start and stop the server;0002
    
por jomaweb 19.08.2016 / 23:18

2 respostas

2

Parece que você quer algo como:

awk 'BEGIN{FS=OFS=";"}
FNR==1{print "filename;good;fairly good;bad;id"}
$2=="good"{print $1, $4, " ", " ", $3}
$2=="fairly good"{print $1, " ", $4, " ", $3}
$2=="bad"{print $1, " ", " ", $4, $3}' infile

para que a coluna de classificação correspondente contenha o resumo e os outros dois obtenham apenas um espaço (conforme o seu exemplo - se você precisar de um campo vazio, substitua " " por "" )

    
por 20.08.2016 / 03:34
1

Uma pequena modificação no script do don_crissti

awk -F\; '
    BEGIN{
        P["good"]="%s;%s;;;%s\n"
        P["fairly good"]="%s;;%s;;%s\n"
        P["bad"]="%s;;;%s;%s\n"
        }                         
    FNR==1{
        print "filename;good;fairly good;bad;id"
        next
        }
    {
        printf(P[$2],$1,$4,$3)
        }
    ' infile
    
por 20.08.2016 / 10:32