Transposição dinâmica de linhas para colunas usando o awk com base no valor da linha

0

Eu tenho um arquivo com dados para data_0 para data_4 repetido em linhas. Eu preciso convertê-lo em valores de colunas no conjunto de dados respeitado. Existe alguma maneira de colocar em branco / valor nulo caso os dados estejam faltando para a categoria anterior. Por exemplo

TimeStamp,Block,No_of_requests
04:19:12,data_0,4
04:19:12,data_1,6
04:19:12,date_2,8
04:19:12,date_3,10
04:19:12,data_4,12
04:19:14,data_0,5
04:19:14,data_1,6
04:19:14,date_3,7
04:19:14,data_4,8

A saída esperada é

TimeStamp,data_0,data_1,data_2,data_3,data_4
04:19:12,4,6,8,10,12
04:19:14,5,6,,7,8

Deve colocar dados vazios caso valor para os respectivos data_x não está disponível.

    
por Sachin Gupta 16.02.2018 / 17:05

2 respostas

3

Solução

GNU awk :

awk 'BEGIN{ 
         FS = OFS = ",";
         PROCINFO["sorted_in"] = "@ind_num_asc";
         print "TimeStamp,data_0,data_1,data_2,data_3,data_4" 
     }
     NR > 1{ a[$1][substr($2, 6) + 1] = $3 }
     END{ 
         for (i in a) { 
             printf "%s,", i;
             for (j=0; j<=4; j++) printf "%s%s", a[i][j+1], (j == 4? ORS:OFS) 
         }
     }' file

A saída:

TimeStamp,data_0,data_1,data_2,data_3,data_4
04:19:12,4,6,8,10,12
04:19:14,5,6,,7,8
    
por 16.02.2018 / 17:36
2

Semelhante à resposta de Roman, mas codifica menos sobre o conteúdo do arquivo

awk -F, -v OFS=, '
    NR > 1 {data[$1][$2] = $3; blocks[$2]}
    END {
        PROCINFO["sorted_in"] = "@ind_str_asc"

        # header
        printf "TimeStamp"
        for (block in blocks) {
            printf "%s%s", OFS, block
        }
        print ""

        # data
        for (ts in data) {
            printf "%s", ts
            for (block in blocks) {
                printf "%s%s", OFS, data[ts][block]
            }
            print ""
        }
    }
' file
TimeStamp,data_0,data_1,data_4,date_2,date_3
04:19:12,4,6,12,8,10
04:19:14,5,6,8,,7

Observe que seus dados de amostra usam " data " e " data " ambos.

    
por 16.02.2018 / 17:44

Tags