Obtenha pares de linhas e multiplique

Obtenha pares de linhas e multiplique

Estou tentando analisar um arquivo html para alguns valores usando o bash. Então, eu tenho um grande arquivo de texto com números como este

3
2
4
2

O que eu quero fazer é pegar duas linhas, multiplicar os dois números e depois armazenar o valor em uma variável e adicioná-lo ao total. Neste caso seria 3*2=6e 4*2=8. Então .X=0, X=X+6, X=X+8X=14

Responder1

Tentar

xargs -n2 < file | while read x y; do ((X+=x*y)); echo $X; done
  • xargs -n2: agrupa números em pares
  • read x y: armazena o primeiro e o segundo número em variáveis x​​ey
  • ((...))é apenas uma avaliação aritmética no bash

Você verá na tela como a soma está crescendo.

Responder2

Você pode usar pastee bcfazer o que quiser:

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

Discriminação

Aqui podemos ver que pasteestá pegando 2 de cada vez e colocando um sinal de multiplicação entre eles.

$ paste -d"*" - - <file.txt
3*2
4*2

Uma abordagem semelhante pode ser usada para incluir os sinais de multiplicação:

$ paste -d"*" - - <file.txt | paste -d"+"
3*2+4*2

Finalmente, a string finalizada pode ser passada para bcrealizar as operações matemáticas.

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

O uso de pastenos comandos acima varia. Ao realizar a fusão das linhas para formar o X*Y, dizemos ao paste para pegar 2 linhas (denotadas como travessões:) - -. No segundo caso, estamos usando pastetoda a série de caracteres e incorporando um +entre cada átomo.

Responder3

Aqui está uma awksolução (assumindo um número par de linhas)

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

informação relacionada