Dans un fichier avec un nombre différent de colonnes délimitées par un espace '', Comment compter la somme des colonnes. Un exemple montrerait la nécessité:
File A:
1 2
2 3
4 5 6
1 1 1 5
La sortie serait alors:
- pour la colonne 1 (1 + 2 + 4 + 1) = 8
- pour la colonne 2 est 11
- pour la colonne 3 est 7
- pour la colonne 4 est 5
command-line
scripts
Maythux
la source
la source
À utiliser
numsum
pour cette tâche et à séparer entre le traitement des données et la sortie des résultats.Installez
num-utils
, nous avons besoinnumsum
Et commencez par
Exemple
ou avec le format souhaité:
de
man numsum
exemples de
man numsum
la source
la source
(( col1 += a ))
, etc. Aussi,echo "..."
est plus sûr, ainsi quewhile IFS= read -r ...
echo
est sûr à utiliser de cette façon pour faire écho aux nombres, aux$IFS
valeurs par défaut dans les espaces et ceux-ci devraient être des nombres, donc il n'est pas nécessaire de traiter les contre-obliques. Le seul inconvénient de cette réponse est la nécessité de connaître le nombre de colonnes avant l'exécution.echo "[...]"
pour imprimer correctement ce que vous ne voulez pas produire n'a aucun sens.echo $var
etwhile read a b c
cela fonctionne ici. Cependant, vous vous habituerez à l'écrire de manière faible et un jour vous obtiendrez d'étranges erreurs lors du traitement d'un fichier plus complexe. Ensuite, vous remarquerez la citation de variables et l'utilisationwhile IFS= read -r ...
était plus sûre et vous direz "oh ouais fedorqui avait raison, j'espère que je pourrais l'avoir autour de lui pour le serrer dans ses bras pour lui montrer sa gratitude!".À en juger par les commentaires de votre propre réponse, vous ne voulez que la somme d'une colonne à la fois. Si c'est le cas, voici une façon non awk de le faire:
où vous remplaceriez le
3
par le numéro de colonne qui vous intéresse.la source
Voici une approche de script Perl à une ligne. Cela repose sur l'utilisation de
-a
flag qui permet de diviser automatiquement la ligne actuellement lue avec-n
flag en tableau@F
. Tout ce que nous avons à faire est d'itérer sur ces éléments et de les ajouter à leur index respectif dans le$sum
tableau, ainsi chaque élément du tableau est effectivement la somme de chaque colonne respective. Enfin, nous imprimons le résultat dans leEND
bloc de code.Alternativement, voici une approche complète du script Perl. Il repose sur la division de chaque ligne en tableau et l'itération sur chaque élément de ce tableau en ajoutant chaque numéro à leur possession respective dans le
@sums
tableau. Le script imprime chaque ligne, puis produit un rapport pour chaque colonne. L'impression de chaque ligne peut être supprimée en ajoutant#
avantprintf("%s",$line);
L'utilisation est simple
chmod +x ./sum_columns.pl && ./sum_columns.pl input.txt
. Par exemple:la source
Une solution simple:
Remplacez i par le numéro de colonne, par exemple column1:
la sortie est:
la source