我有一个文件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的情况下,有没有一种简单的方法来进行浮点数计算?
发布于 2019-03-19 20:25:52
要将变量转换为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()。同样,对于第二种选择,您必须拆分行,然后将它们转换为浮点数。
要获得有关标准输入路线的额外乐趣,请查看: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-19 20:41:43
有必要运行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
https://stackoverflow.com/questions/55248972
复制相似问题