Ajoutez une liste de valeurs des colonnes A et B séparées par un espace et affichez le résultat de la somme [dupliquer]
J'ai un fichier appelé fold.txt
. Il a deux valeurs dans chaque ligne séparées par un espace. Si je dis que la première valeur représente la colonne A et la deuxième valeur après l'espace est la colonne B, comment puis-je ajouter toutes les valeurs de la colonne A et toutes les valeurs de la colonne B et afficher la somme de chaque colonne individuellement?
J'attends quelque chose comme ça:
$ cat fold.txt
100 500
200 300
700 100
Production:
Total count Column A = 1000
Total count column B = 900
Réponses
Avec awk
:
awk '{ sum_A +=$1; sum_B+=$2; };
END{ print "Total count Column A = " sum_A +0;
print "Total count column B = " sum_B +0;
}' infile
en langage awk qui est un outil à des fins de traitement de texte, $1
représente la valeur de la première colonne , représente la valeur de la $2
deuxième colonne, $3
pour la troisième et ainsi de suite et un spécial NF
représente le dernier identifiant de colonne et $NF
est donc la valeur de la dernière colonne (vous pouvez donc remplacer $2
ci-dessus avec $NF
aussi; et oui, vous l'attrapez quand NF
est la dernière colonne Id, donc la valeur de la variable vous indique combien de colonnes avez-vous (sa mise à jour de valeur pour chaque ligne awk est lue depuis l'entrée)).
Pour gérer le cas de bord où le fichier d'entrée est vide et toujours obtenir une sortie numérique, nous ajoutons 0 au résultat en forçant awk
à produire un résultat numérique.
les colonnes (ou champs) en awk
distinguant par la FS
variable ( F EILD S eparator) , qui par défaut est d' utiliser l' espace / Tabs. si vous voulez des colonnes divisées sur un caractère différent, vous pouvez le redéfinir avec l' -F
option awk
comme dans:
awk -F'<character-here>' '...' infile
ou dans un BEGIN{...}
bloc comme avec FS
:
awk 'BEGIN{ FS="<character-here>"; }; { ... }' infile
par exemple pour un fichier d'entrée comme ci-dessous (maintenant c'est une virgule au lieu d'un espace):
100,500
200,300
700,100
vous pouvez écrire votre awk
code comme suit:
awk -F',' '{ sum_A +=$1; sum_B+=$2; };
END{ print "Total count Column A = " sum_A +0;
print "Total count column B = " sum_B +0;
}' infile
Ou dans le BEGIN
bloc:
awk 'BEGIN{ FS=","; }; { sum_A +=$1; sum_B+=$2; };
END{ print "Total count Column A = " sum_A +0;
print "Total count column B = " sum_B +0;
}' infile
Aller un peu complexe et faire la somme des N colonnes de votre fichier d'entrée sur l'exemple suivant:
100,500,140,400
200,300,640,200
700,100,400,130
Nous en avons donc parlé NF
dans le premier paragraphe (la valeur NF vous indique combien de colonnes avez-vous (mise à jour pour chaque ligne)):
awk -F',' '{ for (i=1; i<=NF; i++) sum[i]+=$i; };
END{ for (colId in sum) {
printf ("Total count Column: %d= %d\n", colId, sum[colId] );
};
}' infile
la seule nouveauté ici est que nous avons utilisé un awk
tableau pour adresser le même identifiant de colonne en prenant la valeur de i
et ajouter leurs valeurs $i
dans ce tableau (l'index / les clés de ce tableau sont les identifiants de colonne); puis au END{...}
bloc, nous bouclons notre tableau sur les clés qu'il voit, puis imprimons d'abord l'ID de colonne, puis la somme de ceux à côté, vous verrez une sortie comme ci-dessous:
Total count Column: 1= 1000
Total count Column: 2= 900
Total count Column: 3= 1180
Total count Column: 4= 730
C'est un bon travail pour DC.
dc lit d'abord les données de fold.txt et après le code de sum_col_dc.
Utilisez-le comme ça: dc fold.txt sum_col_dc
cat sum_col_dc
[lB+sBlA+sAz0<C]sC[lGLElDnnnp]sH[Total count Column ]sD[B]sE[A]SE[ = ]sGlCxlAlHxlBlHx
Avec un peu plus de détails:
[lB+sBlA+sAz0<C]sC
[lGLElDnnnp]sH
[Total count Column ]sD
[B]sE
[A]SE
[ = ]sG
lCx
lA
lHx
lB
lHx
Profitez de dc
Plus d'explications sur demande.