Obtenha pares de linhas e multiplique [fechado]

3

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 é obter duas linhas, multiplicar ambos os números e, em seguida, armazenar o valor em uma variável e adicioná-lo a um total. Nesse caso, seria 3*2=6 e 4*2=8 . Então, X=0, X=X+6, X=X+8 then X=14 .

    
por mormaii2 14.11.2014 / 19:01

3 respostas

8

Tente

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

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

    
por 14.11.2014 / 19:23
4

Você pode usar paste e bc para fazer o que quiser:

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

Divisão

Aqui podemos ver que paste está demorando 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 bc para executar as operações matemáticas.

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

O uso de paste nos comandos acima varia. Ao realizar a fusão das linhas para formar o X * Y, dizemos ao colar para obter 2 linhas (denotadas como traços: - - ). No segundo caso, estamos usando paste para obter toda a série de caracteres e incorporar um + entre cada átomo.

    
por 14.11.2014 / 19:30
4

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

 awk '{y=$0; getline x; var += x*y};END{print var}' file.txt
    
por 14.11.2014 / 23:29