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]

Dec 29 2020

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

5 αғsнιη Dec 29 2020 at 00:00

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, $1représente la valeur de la première colonne , représente la valeur de la $2deuxième colonne, $3pour la troisième et ainsi de suite et un spécial NFreprésente le dernier identifiant de colonne et $NFest donc la valeur de la dernière colonne (vous pouvez donc remplacer $2ci-dessus avec $NFaussi; et oui, vous l'attrapez quand NFest 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 awkdistinguant par la FSvariable ( 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' -Foption awkcomme 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 awkcode 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 BEGINbloc:

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é NFdans 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 awktableau pour adresser le même identifiant de colonne en prenant la valeur de iet ajouter leurs valeurs $idans 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
ctac_ Dec 30 2020 at 01:56

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.