J'ai un gros fichier au format suivant:
2 1019 0 12
2 1019 3 0
2 1021 0 2
2 1021 2 0
2 1022 4 5
2 1030 0 1
2 1030 5 0
2 1031 4 4
Si les valeurs de la colonne 2 correspondent, je veux additionner les valeurs des colonnes 3 et 4 des deux lignes, sinon juste la somme des valeurs de la ligne unique.
Ainsi, la sortie que j'espère ressemblerait à ceci:
2 1019 15
2 1021 4
2 1022 9
2 1030 6
2 1031 8
Je peux trier les fichiers selon la colonne 2 avec awk
ou sort
et additionner les dernières colonnes avec awk
, mais uniquement pour les lignes individuelles et non pour deux lignes où la colonne 2 correspond.
text-processing
awk
sort
uniq
TomPio
la source
la source
$1 $2
comme la clé.Réponses:
Je le ferais en Perl:
Ou awk:
Si vous souhaitez que la sortie soit triée selon la deuxième colonne, vous pouvez simplement diriger vers
sort
:Notez que les deux solutions incluent également la 1ère colonne. L'idée est d'utiliser les première et deuxième colonnes comme clés d'un hachage (en perl) ou d'un tableau associatif (en awk). La clé de chaque solution est
column1 column2
que si deux lignes ont la même colonne deux mais une colonne différente, elles seront regroupées séparément:la source
Cela pourrait peut-être aider, mais la colonne 1 est-elle toujours 2 et les résultats en dépendent-ils?
ou comme l'a mentionné glenn jackman dans les commentaires sur le tri:
la source
PROCINFO["sorted_in"] = "@ind_num_asc"
plutôt que pipingsort
. ref gnu.org/software/gawk/manual/html_node/…Vous pouvez pré-trier les données et laisser awk gérer les détails:
Vous voudrez peut-être réinitialiser l'accumulateur:
Production:
Si vous voulez vraiment garder la première colonne, faites quelque chose comme ceci:
Production:
Explication
La
p
variable contient la$2
valeur de la ligne précédente, ou$1FS$2
dans le deuxième cas ci-dessus. Cela signifie que le{print p,s}
est déclenché lorsque$2
la ligne précédente n'est pas la même que celle de la ligne actuelle (p!=$2
).la source
sort -k2
pour trier par la deuxième colonneUtilisation du couteau suisse
mlr
:Production:
Remarques:
--nidx
indiquemlr
d'utiliser des noms de champs numériques.put '$5=$3+$4'
crée un nouveau 5ème champ, la somme des champs 3 et 4 .La
stats1
fonction (ou « verbe ») est un couteau plus petit de l' armée suissedans le plus grand suisse couteau de
mlr
, avec plusieurs fonctions à base d'accumulateurs tels quesum
,count
,mean
, etc.stats1 -g 1,2
regroupe les données par les colonnes 1 et 2 ,-f 5 -a sum
puis additionne le champ 5 de ces groupes .stats1
imprime uniquement les champs nommés.la source