2017-04-27 1 views
1

Cette question est plus ou moins une variante https://unix.stackexchange.com/questions/242946/using-awk-to-sum-the-values-of-a-column-based-on-the-values-of-another-columnUtiliser awk pour additionner les valeurs d'une colonne, sur la base des valeurs d'une autre colonne, ajoutez la somme et le pourcentage des données originales

entrée même:

smiths|Login|2 
olivert|Login|10 
denniss|Payroll|100 
smiths|Time|200 
smiths|Logout|10 

Je voudrais avoir le résultat suivant:

smiths|Login|2|212 
olivert|Login|10|10 
denniss|Payroll|100|100 
smiths|Time|200|212 
smiths|Logout|10|212 

par conséquent, la somme de la colonne 3 pour toutes les entrées avec le même modèle dans colu mn 1 devrait être ajouté.

En outre, ajoutez une autre colonne avec le pourcentage, ce qui donne le résultat suivant:

smiths|Login|2|212|0.94 
olivert|Login|10|10|100 
denniss|Payroll|100|100|100 
smiths|Time|200|212|94.34 
smiths|Logout|10|212|4.72 

Répondre

3

est ici qui n'arrondit pas les pourcentages, mais les poignées division par zéro erreurs:

Ajout à les données d'essai d'un couple de disques:

$ cat >> file 
test|test| 
test2|test2|0 

code:

$ awk ' 
BEGIN { FS=OFS="|" } 
NR==FNR { s[$1]+=$3; next } 
{ print $0,s[$1],$3/(s[$1]?s[$1]:1)*100 } 
' file file 

Sortie:

smiths|Login|2|212|0.943396 
olivert|Login|10|10|100 
denniss|Payroll|100|100|100 
smiths|Time|200|212|94.3396 
smiths|Logout|10|212|4.71698 
test|test||0|0 
test2|test2|0|0|0 
+1

fonctionne très bien, merci! – Markus

1

gawk approche:

awk -F'|' '{a[$1]+=$3; b[NR]=$0}END{ for(i in b) {split(b[i], data, FS); 
    print b[i] FS a[data[1]] FS sprintf("%0.2f", data[3]/a[data[1]]*100) }}' file 

La sortie:

smiths|Login|2|212|0.94 
olivert|Login|10|10|100.00 
denniss|Payroll|100|100|100.00 
smiths|Time|200|212|94.34 
smiths|Logout|10|212|4.72 
+0

Fonctionne très bien aussi, merci! – Markus