
Estoy intentando analizar un archivo html en busca de algunos valores usando bash. Entonces tengo un archivo de texto grande con números como este.
3
2
4
2
Lo que quiero hacer es obtener dos líneas, multiplicar ambos números y luego almacenar el valor en una variable y sumarlo al total. En este caso sería 3*2=6
y 4*2=8
. Por lo que X=0, X=X+6, X=X+8
entonces X=14
.
Respuesta1
Intentar
xargs -n2 < file | while read x y; do ((X+=x*y)); echo $X; done
xargs -n2
: agrupa números en paresread x y
: almacena el primer y segundo número en variablesx
yy
((...))
es solo una evaluación aritmética en bash
Verás en la pantalla cómo va creciendo la suma.
Respuesta2
Puedes usar paste
y bc
para hacer lo que quieras:
$ paste -d"*" - - <file.txt | paste -d"+" - - | bc
14
Descomponer
Aquí podemos ver que paste
va tomando 2 a la vez y está poniendo un signo de multiplicación entre ellos.
$ paste -d"*" - - <file.txt
3*2
4*2
Se puede utilizar un enfoque similar para incluir los signos de multiplicación:
$ paste -d"*" - - <file.txt | paste -d"+"
3*2+4*2
Finalmente se puede pasar la cadena terminada para bc
realizar las operaciones matemáticas.
$ paste -d"*" - - <file.txt | paste -s -d'+' | bc
14
El uso de paste
en los comandos anteriores varía. Al fusionar las líneas para formar X*Y, le decimos a pegar que tome 2 líneas (indicadas como guiones:) - -. En el segundo caso, utilizamos paste
para tomar la serie completa de caracteres e incorporar un +elemento entre cada átomo.
Respuesta3
Aquí hay una awk
solución (asumiendo un número par de líneas)
awk '{y=$0; getline x; var += x*y};END{print var}' file.txt