0

我有一个文件 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] 并进行浮点计算,例如对除前两个 sum([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 的情况下进行这种浮点计算?

4

2 回答 2

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
于 2019-03-19T20:25:51.670 回答
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
于 2019-03-19T20:41:42.710 回答