Dinamização de dados de linha dinâmicos para colunas que possuem valores únicos em outra coluna

0

Estou preso a um requisito específico que requer a conversão de dados de linha dinâmicos em campos de coluna. Suponha que estou tendo um arquivo "output.csv" com o conteúdo como:

TimeStamp,Block,No_of_requests
04:19:12,Block_1,4
04:19:12,Block_2,4
04:19:14,Block_1,3
04:19:15,Block_1,1
04:19:15,Block_2,2
04:19:16,Block_1,5
04:19:16,Block_2,1

O que eu preciso que a saída seja:

TimeStamp,Block_1,Block_2
04:19:12,4,4
04:19:14,3,
04:19:15,1,2
04:19:16,5,1

O arquivo output.csv é criado dinamicamente usando um script, portanto, não tenho um número restrito de blocos (aqui tenho Block_1 & Block_2, mas o script pode produzir muito mais, por exemplo, Block_3, Block_4, Block_5 e assim por diante)

Preciso dos números de bloco como cabeçalhos de coluna e o número de solicitações em cada bloco para valores exclusivos de carimbo de data / hora.

Tenho andado a pensar nisso há já algum tempo, mas ainda não sei onde criar este pivot.

    
por SohomB 18.09.2017 / 17:31

2 respostas

0

Simplesmente awk script, supondo que seus dados de entrada estão classificados.

awk -F',' 'NR>1 {a[$1]=a[$1]","$3}
    END{ print "Timestamp, Block_1, Block_2"; 
         for (i in a) print i""a[i]}' infile

senão primeiro classifique-o e passe para acima de awk .

awk -F',' 'NR>1 {a[$1]=a[$1]","$3}
    END{ print "Timestamp, Block_1, Block_2"; 
         for (i in a) print i""a[i]}' <(sort infile) 
    
por 18.09.2017 / 17:51
0

O datamash do GNU deixa você bem perto:

$ datamash -st, --header-in --filler='' crosstab 1,2 unique 3 < output.csv 
,Block_1,Block_2
04:19:12,4,4
04:19:14,3,
04:19:15,1,2
04:19:16,5,1

Se você quiser inserir novamente o título TimeStamp , poderá passar por sed :

$ datamash -st, --header-in --filler='' crosstab 1,2 unique 3 < output.csv | 
    sed '1s/^/Timestamp/'
Timestamp,Block_1,Block_2
04:19:12,4,4
04:19:14,3,
04:19:15,1,2
04:19:16,5,1
    
por 18.09.2017 / 19:20