从文件的最后一行开始Bash浮动计算

时间:2019-03-19 19:48:53

标签: python bash variables floating-point calculator

我有一个文件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 ans = 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 个答案:

答案 0 :(得分:1)

您可以执行一些操作来将变量获取到Python。您可以将其作为参数传递,也可以通过sys.stdin在该行中读取python。

将该行作为参数传递给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

我建议您编写一个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

答案 1 :(得分:1)

对于这样简单的计算,是否需要运行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