Получить пары линий и умножить

Получить пары линий и умножить

Я пытаюсь разобрать html-файл на некоторые значения с помощью bash. Итак, у меня есть большой текстовый файл с числами вроде этого

3
2
4
2

Я хочу получить две строки, умножить оба числа, а затем сохранить значение в переменной и добавить его к итогу. В этом случае это будет 3*2=6и 4*2=8. X=0, X=X+6, X=X+8Тогда X=14.

решение1

Пытаться

xargs -n2 < file | while read x y; do ((X+=x*y)); echo $X; done
  • xargs -n2: группирует числа в пары
  • read x y: сохранить первое и второе число в переменных xиy
  • ((...))это просто арифметическая оценка в bash

На экране вы увидите, как растет сумма.

решение2

Вы можете использовать pasteи bcдля выполнения любых действий:

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

Авария

Здесь мы видим, что pasteберется по 2 за раз и между ними ставится знак умножения.

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

Аналогичный подход можно использовать для включения знаков умножения:

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

Наконец, готовую строку можно передать для bcвыполнения математических операций.

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

Использование pasteв приведенных выше командах различается. При выполнении слияния строк для формирования X*Y мы говорим paste взять 2 строки (обозначенные как тире: - -). Во втором случае мы используем , pasteчтобы взять всю серию символов и вставить a +между каждым атомом.

решение3

Вот awkрешение (предполагая четное количество строк):

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

Связанный контент