Obtener pares de líneas y multiplicar

Obtener pares de líneas y multiplicar

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=6y 4*2=8. Por lo que X=0, X=X+6, X=X+8entonces X=14.

Respuesta1

Intentar

xargs -n2 < file | while read x y; do ((X+=x*y)); echo $X; done
  • xargs -n2: agrupa números en pares
  • read x y: almacena el primer y segundo número en variables xyy
  • ((...))es solo una evaluación aritmética en bash

Verás en la pantalla cómo va creciendo la suma.

Respuesta2

Puedes usar pastey bcpara hacer lo que quieras:

$ paste -d"*" - - <file.txt | paste -d"+" - - | bc
14

Descomponer

Aquí podemos ver que pasteva 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 bcrealizar las operaciones matemáticas.

$ paste -d"*" - - <file.txt | paste -s -d'+' | bc
14

El uso de pasteen 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 pastepara tomar la serie completa de caracteres e incorporar un +elemento entre cada átomo.

Respuesta3

Aquí hay una awksolución (asumiendo un número par de líneas)

 awk '{y=$0; getline x; var += x*y};END{print var}' file.txt

información relacionada