【问题标题】:Bash Script- adding numbers to each line in fileBash 脚本 - 向文件中的每一行添加数字
【发布时间】:2017-11-28 18:52:30
【问题描述】:

我有一个 .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

但这会输出错误“无效的算术运算符”。对如何完成这项任务有什么建议吗?

更新: 根据下面的一些建议,我研究了使用 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。我对此有点困惑。有什么想法吗?

【问题讨论】:

    标签: bash for-loop scripting


    【解决方案1】:

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

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

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

    【讨论】:

    • 当我运行它时,它不会在每行添加 5,而是添加大约 2.77。知道这可能意味着什么吗?
    • @DaxFeliz:你输入的内容真的只包含数字吗?
    • 是的。这是一个简单的数字列。我正在用 awk 探索一个建议,我在这里找到:echo 1.234 2.345 | awk '{print $1 + $2}' stackoverflow.com/questions/16355229/…
    【解决方案2】:

    我认为这里有两个非常明确的问题。首先,在执行加法时,您似乎缺少括号。其次,数字 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
    

    【讨论】:

    • 感谢您的建议。这两种尝试都产生了我遇到的初始错误:“无效的算术运算符(错误标记为“.928989+5”)”
    【解决方案3】:

    Bash 只能做 integer 算术。最简单的方法大概就是使用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
    

    【讨论】:

    • 非常感谢!我已经更改了原始代码中的数字,以反映我所使用的这种方法的问题。当我运行它时,它不会为每行添加 5,而是添加大约 2.77。知道这可能意味着什么吗?
    • 这适用于我的示例数据。您是否完全使用上面的代码? (例如"$i + 5" 而不是"$i + $5"
    • 奇怪。我已经按照您在 while 循环中的建议尝试了 $(bc
    • 很遗憾,我现在无法在 Mac 上试用。使用 Perl 是一种选择吗? :)
    【解决方案4】:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-18
      • 1970-01-01
      • 1970-01-01
      • 2014-09-04
      • 2010-10-04
      • 1970-01-01
      • 2011-03-11
      相关资源
      最近更新 更多