Bash脚本 - 为文件中的每一行添加数字

时间:2017-06-25 22:19:01

标签: bash for-loop scripting

我有一个包含一列值的.txt文件,例如:

2453882.157576
2453882.157947
2453882.159972
2453882.160354
2453882.160724

我想为代码中的每一行添加一个值,让我们说5.所以输出将是:

2453887.157576
2453887.157947
2453887.159972
2453887.160354
2453887.160724

我对bash命令相当新,我有点不确定要使用哪些命令。 我认为尝试迭代文件并简单地通过它添加可能是有用的:

while read i; do
  shift=$(($i + $5)) 
done <filename.txt > shifted_by_5_filename.txt

但这会输出错误&#34;无效算术运算符&#34;。关于如何完成这项任务有什么建议吗?

更新: 通过下面的一些建议,我已经研究过使用awk来尝试添加浮点数(而不是整数加法)。我发现了另一个问题: how to add Integer number and a float number in unix shell script

有答案可以添加两个花车:

echo 1.234 2.345 | awk '{print $1 + $2}'

为了尝试将此问题扩展到我的问题,我尝试了以下方法:

while read i
do echo $i 5 | awk '{print sprintf("%.9f", ($1+ $2))}'
done < filename.txt > shifted_by_5_filename.txt

sprintf命令是尝试生成非科学记数法的输出。但是,与下面的建议一样,此尝试不会增加5而是增加2.771413。我对此感到有点困惑。有什么想法吗?

4 个答案:

答案 0 :(得分:4)

Bash不处理浮点算术。您需要一个外部命令,例如bc

sed 's/$/+5/' file.txt | bc

sed命令只是将+5添加到每一行的末尾,它比通过shell逐行读取输入更快更容易。

答案 1 :(得分:1)

Bash只能执行整数算术运算。最简单的方法可能是使用bc

while read i; do
   echo $(bc <<< "$i + 5")                                                  
done <filename.txt > shifted_by_5_filename.txt

或者,你可以使用一些通用的解释器,例如的Perl:

perl -ple '$_ += 5' filename.txt > shifted_by_5_filename.txt

答案 2 :(得分:1)

bash中的算术扩展仅适用于整数,因此对于浮点数,您需要bcawkpythonperlruby或类似的。例如bc

while read i; do
   echo "$i + 5" | bc -l
done <filename.txt > shifted_by_5_filename.txt

或者使用这个简单的awk脚本:

awk '{print $0+5}' filename.txt >shifted_by_5_filename.txt

答案 3 :(得分:1)

我相信这里有两个非常明确的问题。首先,当您执行添加时,看起来您缺少一个括号。其次,你不需要5号的美元。

使用班次变量:

while read i; do
    shift=5
    sum=$(($i+$shift))
    echo $sum
done < input.txt > output.txt

或者如果你想使用你的常数:

while read i; do
    sum=$(($i+5))
    echo $sum
done < input.txt > output.txt