我有一个文件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的情况下有一种简单的方法来进行浮点计算?
答案 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