J'ai un fichier contenant seulement deux lignes, avec la structure suivante:
$ cat /tmp/pwpower.log
000D6F0000D34227, -114.10
000D6F0001A405C4, -130.09
Les valeurs sont les valeurs de puissance de ma centrale solaire. Une valeur négative signifie une génération.
J'aurais besoin des valeurs extraites via grep / sed / awk - quelle que soit la manière la plus intelligente. J'ai besoin d'extraire les deux valeurs séparément et sans le signe moins.
Ce que je fais maintenant est un peu stupide mais cela fonctionne - je suis sûr que beaucoup d'entre vous auront des moyens plus intelligents pour moi :-) Ici, bien sûr, je ne vois que les valeurs plus Minus.
Pour obtenir la première valeur:
cat /tmp/pwpower.log |grep -o "\-.*" | head -n 1
Pour obtenir la deuxième valeur:
cat /tmp/pwpower.log |grep -o "\-.*" | tail -n1
Et question connexe, existe-t-il un moyen simple de prendre ces chaînes et de les transformer pour que je puisse calculer la somme?
la source
-F-
ça va.tr -d "- "
abord.-F-
.Vous pouvez utiliser
cut
pour sélectionner la 2e colonne de nombres etpaste -sd+
pour créer une série de nombres à additionner. L'outilbc
peut ensuite être utilisé pour effectuer le calcul.Comment ça fonctionne
Sélectionne les nombres dans la 2ème colonne.
Les reformate en une seule ligne avec un
+
signe entre chaque numéro:Effectue le calcul:
Pour obtenir la valeur absolue:
Si le format du fichier
pwpower.log
est garanti, vous pouvez avoircut
omis le signe moins:la source
Une approche KISS
la source
J'aime votre commande grep, mais elle pourrait être améliorée pour supprimer le signe moins et fonctionner dans les cas où il n'y a pas de signe moins. Les expressions régulières étendues disponibles dans GNU grep avec le
-E
drapeau nous permettent de faire correspondre un nombre plus précisément.Il est légèrement plus efficace de ne pas utiliser cat, mais passez le nom du fichier en argument à la première commande et laissez-le lire le fichier. Il me vient également à l'esprit que si vous ne traitez qu'avec la première ou la dernière ligne du fichier, il est plus logique d'utiliser d'abord les commandes
head
outail
afin de ne faire correspondre qu'une seule ligne avecgrep
.Première valeur:
Dernière valeur:
Sum (avec la commande awk d' ici ):
la source
Cela fera le calcul sans le moins.
Je pense que la coupe est plus rapide que awk, en général
la source
awk
est l'outil, mais le nombre probablement peut être positif ( à droite?), ce qui signifie que vous ne pas à utiliser le signe moins comme séparateur de champ. À la place, utilisez la virgule comme séparateur de champ, puis annulez chaque valeur numériquement -awk
convertira automatiquement les chaînes en nombres pour vous:S'il arrive qu'il y ait des nombres positifs, ils sortiront négatifs. Si vous ne voulez que la somme, vous
awk
pouvez aussi le faire:la source
sqrt($2^2)
une astuce pour obtenir une valeur absolue.Pour additionner les deux valeurs:
la source
awk
?bc
=)awk
?echo $(cut -d- -f2 file | tr '\n' '+')0 | bc
cut
? Utilisez[insert_cmd_here]
plutôt, générez une boucle de sous-shell, inventez de nouveaux mathématiques, utilisez un cluster humain ou une arithmétique mentale, canalisez mes penséesbc
. Pourquoi faisons-nous des choses? Aucune raison de rendre ma réponse mauvaise.Vous pouvez également utiliser sed
la source