Eu tenho alguma saída na forma de:
count id type
588 10 | 3
10 12 | 3
883 14 | 3
98 17 | 3
17 18 | 1
77598 18 | 3
10000 21 | 3
17892 2 | 3
20000 23 | 3
63 27 | 3
6 3 | 3
2446 35 | 3
14 4 | 3
15 4 | 1
253 4 | 2
19857 4 | 3
1000 5 | 3
...
O que é bastante confuso e precisa ser limpo em um CSV para que eu possa presenteá-lo a um gerente de projeto para eles a planilha.
O núcleo do problema é este: preciso que a saída seja:
id, sum_of_type_1, sum_of_type_2, sum_of_type_3
Um exemplo disso é o ID "4":
14 4 | 3
15 4 | 1
253 4 | 2
19857 4 | 3
Em vez disso, deve ser:
4,15,253,19871
Infelizmente, sou um lixo nesse tipo de coisa, consegui limpar todas as linhas e entrar no CSV, mas não consegui desduplicar e agrupar as linhas. Agora eu tenho isso:
awk 'BEGIN{OFS=",";} {split($line, part, " "); print part[1],part[2],part[4]}' | awk '{ gsub (" ", "", $0); print}'
Mas tudo o que faz é limpar os caracteres do lixo e imprimir as linhas novamente.
Qual é a melhor maneira de massagear as linhas na saída mencionada acima?
shell-script
text-processing
awk
sed
csv
Paulo
fonte
fonte
Respostas:
Uma maneira de fazer isso é colocar tudo em um hash.
editar: minha primeira resposta não respondeu à pergunta corretamente
fonte
NF<4{$4="no_type";}
no inícioPerl para o resgate:
Ele mantém duas tabelas, tabela de tipos e tabela de IDs. Para cada ID, ele armazena a soma por tipo.
fonte
Se o GNU datamash for uma opção para você, então
fonte
Python (e a
pandas
biblioteca em particular é muito adequada para esse tipo de trabalhoIsso lê os dados csv em um
pandas DataFrame
Em seguida, agrupamos esses dados por
id
e pegamos a soma da colunacount
o
unstack
remodelações para mover os IDs para as colunas efillna
preenche os campos vazios com os 0sIsso retorna
Como o quadro de dados contém dados ausentes (combinações vazias de tipo de identificação), o pandas transforma os
int
s emfloat
(limitação do funcionamento interno). Se você souber que as entradas serão apenas int, poderá alterar a penúltima linha paradf_sum = df.groupby(('type', 'id'))['count'].sum().unstack('type').fillna(0).astype(int)
fonte
Você pode usar o Perl para fazer um loop sobre o arquivo CSV e acumular a soma dos tipos apropriados em um hash enquanto estiver no caminho. E, no final, exiba as informações coletadas para cada ID.
Estrutura de dados
Isso ajuda a entender o código abaixo:
Perl
Resultado
fonte
minha opinião, não muito diferente dos outros. Usa o GNU awk que possui matrizes de matrizes
saídas
fonte
Você pode usar esse código para resumir valores com base na sua coluna de ID,
Eu adicionei uma declaração awk após o seu código
Vá em frente com isso ...
fonte