J'ai une sortie sous la forme 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
...
Ce qui est assez désordonné et doit être nettoyé au format CSV afin que je puisse le donner à un gestionnaire de projet pour lui la feuille de calcul.
Le cœur du problème est le suivant: j'ai besoin que la sortie de ceci soit:
id, sum_of_type_1, sum_of_type_2, sum_of_type_3
Un exemple de ceci est l'ID "4":
14 4 | 3
15 4 | 1
253 4 | 2
19857 4 | 3
Cela devrait plutôt être:
4,15,253,19871
Malheureusement, je suis assez nul à ce genre de chose, j'ai réussi à nettoyer toutes les lignes et à les convertir en CSV, mais je n'ai pas pu dédupliquer et grouper les lignes. En ce moment, j'ai ceci:
awk 'BEGIN{OFS=",";} {split($line, part, " "); print part[1],part[2],part[4]}' | awk '{ gsub (" ", "", $0); print}'
Mais tout ce que cela fait, c'est nettoyer les caractères de déchets et réimprimer les lignes.
Quelle est la meilleure façon de masser les lignes dans la sortie mentionnée ci-dessus?
Réponses:
Une façon de le faire est de tout mettre dans un hachage.
modifier: ma première réponse n'a pas répondu correctement à la question
la source
NF<4{$4="no_type";}
au débutPerl à la rescousse:
Il conserve deux tables, une table des types et une table des identifiants. Pour chaque id, il stocke la somme par type.
la source
Si le datamash GNU est une option pour vous, alors
la source
Python (et la
pandas
bibliothèque en particulier est très adaptée à ce genre de travailCela lit les données csv dans un
pandas DataFrame
Ensuite, nous regroupons ces données par
id
, et prenons la somme des colonnescount
Le
unstack
remodèle ceci pour déplacer les identifiants vers les colonnes, etfillna
remplit les champs vides avec des 0Cela revient
Étant donné que la trame de données contient des données manquantes (combinaisons de type id vides), pandas transforme le
int
s enfloat
(limitation du fonctionnement interne). Si vous savez que les entrées seront uniquement int, vous pouvez modifier la dernière ligne suivante endf_sum = df.groupby(('type', 'id'))['count'].sum().unstack('type').fillna(0).astype(int)
la source
Vous pouvez utiliser Perl pour parcourir le fichier CSV et accumuler la somme des types appropriés dans un hachage en cours de route. Et à la fin, affichez les informations collectées pour chaque ID.
Structure de données
Cela aide à donner un sens au code ci-dessous:
Perl
Production
la source
mon point de vue, pas trop différent des autres. Utilise GNU awk qui a des tableaux de tableaux
les sorties
la source
Vous pouvez utiliser ce code pour résumer les valeurs en fonction de votre colonne id,
J'ai ajouté une déclaration awk après votre code
Allez-y avec ça ...
la source