Bash float от последней строки в файле - PullRequest
0 голосов
/ 19 марта 2019

У меня есть файл text.txt следующим образом:

A       B        C    D      E    F   G   F 
1.1     2        3    4      5    6   7   8 
1.2    20        30   40     50   60  70  80 
6.3    70.5      10   20.5   10   20  10  30

Я хочу прочитать последнюю строку res = [6.3 70.5 10 20.5 10 20 10 30] и выполнить вычисления с плавающей запятой, такие как сумма всех столбцов, кроме первых двух ([10 20.5 10 20 10 30]), так что ans = 100.5 ; умножить первый столбец 6,3 на 10 и добавить 2 ответа = 65; и так далее

#!/bin/bash

# Input file name
echo -n "File Name: "
read SO

# Read data
res=$(tail -n 1  $SO) #Read last line 
res=($res)            #Convert string to number
echo $res

#Float calculations 
python -c "print sum($res[2:])"
python -c "print $res[0]*10+2)"

Код работает ожидаемо для вычислений с плавающей запятой, которые дают синтаксическую ошибку. Мой вопрос, как передать массив $ res в Python? Или есть простой способ сделать это вычисление с плавающей запятой для данного массива $ res?

Ответы [ 2 ]

1 голос
/ 19 марта 2019

Нужно ли запускать python для таких простых вычислений?

Вы можете запустить bc для этой операции. Это наиболее распространенный способ вычисления в bash, особенно для чисел с плавающей запятой.

Вы можете сделать что-то вроде:

res=(6.3 70.5 10 20.5 10 20 10 30)
echo ${res[@]:2} | tr ' ' + | bc
echo "${res[0]} * 10 + 2" | bc
1 голос
/ 19 марта 2019

Есть несколько вещей, которые вы можете сделать, чтобы получить переменную для Python.Вы можете передать его в качестве аргументов или вы также можете прочитать Python в этой строке через sys.stdin.

Передать строку в качестве аргументов Python:

$ bar=$(tail -1 numbers.txt )
$ echo $bar
6.3 70.5 10 20.5 10 20 10 30
$ python -c "import sys; print sys.argv" $bar
['-c', '6.3', '70.5', '10', '20.5', '10', '20', '10', '30']

Передать строку через stdin:

$ echo "$bar" | python -c "import sys; print sys.argv; print sys.stdin.read()" 
['-c']
6.3    70.5      10   20.5   10   20  10  30

Обратите внимание, что эти значения являются строками, и вам необходимо преобразовать их в float (), прежде чем выполнять какие-либо математические операции с ними.Также со вторым вариантом вам придется разделить строку и затем преобразовать их в число с плавающей точкой.

Для дополнительного удовольствия от маршрута stdin, посмотрите на: https://docs.python.org/3.7/library/fileinput.html

IЯ бы порекомендовал вам написать скрипт на python вместо использования python -c, так как он может быть довольно быстрым.Назовите скрипт: process_numbers.py со следующим содержимым:

#!/usr/bin/env python
import sys
# quick list comprehension to convert args to floats
numbers = [float(i) for i in sys.argv[1:]]
print numbers
print numbers[0]*10 + 2

Затем в вашем скрипте bash:

python process_numbers.py $(tail -1 numbers.txt)
[6.3, 70.5, 10.0, 20.5, 10.0, 20.0, 10.0, 30.0]
65.0
...