我有一个包含一列值的.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。我对此感到有点困惑。有什么想法吗?
答案 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中的算术扩展仅适用于整数,因此对于浮点数,您需要bc
,awk
,python
,perl
,ruby
或类似的。例如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