2017-10-05 2 views
0

En essayant d'obtenir les colonnes (sauf la première) d'une tabulation délimitée par des nombres.Bash Colum somme sur une table de longueur variable

Pour connaître le nombre de colonnes d'un magasin dans une variable que j'utilise:

cols=$(awk '{print NF}' file.txt | sort -nu | tail -n 1

suivant Je veux calculer la somme de tous les nombres dans cette colonne et stocker ce nouveau dans une variable une boucle:

for c in 2:$col 
do 
    num=$(cat file.txt | awk '{sum+$2 ; print $0} END{print sum}'| tail -n 1 
done 

cette num=$(cat file.txt | awk '{sum+$($c) ; print $0} END{print sum}'| tail -n 1 sur lui-même avec un numer fixe et sans travaux d'entrée variables trouver, mais je ne peux pas obtenir d'accepter la boucle for v ariable.

Merci pour le soutien

p.s. Ce serait également bien si je pouvais résumer toutes les colonnes (expépt le premier) à la fois sans le problème de boucle.

Répondre

1

En supposant que vous voulez que les sommes des colonnes individuelles,

$ cat file 
1 2 3 4 
5 6 7 8 
9 10 11 12 

$ awk ' 
    {for (i=2; i<=NF; i++) sum[i] += $i} 
    END {for (i=2; i<=NF; i++) printf "%d%s", sum[i], OFS; print ""} 
' file 
18 21 24 
+0

Merci beaucoup. Fonctionne comme un charme. –

1

Si vous n'êtes pas obligé de awk, il y a un bel outil pour « ligne de commande statistical operations » sur les fichiers textuels appelé GNU datamash.

Avec datamash, la somme (probablement l'opération la plus simple de tous) une 2ème colonne est aussi facile que:

$ datamash sum 2 < table 
9 

En supposant que le fichier table contient des données séparées par des tabulations comme:

$ cat table 
1 2 3 4 
2 3 4 5 
3 4 5 6 

Pour somme toutes les colonnes 2-n utilisation column ranges (disponible en datamash 1.2):

$ n=4 
$ datamash sum 2-$n < table 
9 12 15 

Pour inclure les en-têtes, voir l'option --headers-out