【问题标题】:Cannot subtract negative numbers after declaring one a minimum using bash使用 bash 声明一个最小值后不能减去负数
【发布时间】:2019-07-25 18:13:07
【问题描述】:

我正在编辑的脚本从近 100 个文件中获取数据并将其汇集到一个文件中。我现在正在尝试处理这些数据。我可以毫无问题地提取和汇集数据,我的问题是在处理它的时候出现的。

我正在尝试做两件事。我想在第 3 列中找到负数的最小值,然后从第 3 列中的每个值中减去该最小值,然后在标题为“rel”的新列中打印结果。目前,我已成功找到最小值,但无法进行减法运算。

我的输入文件(名为 allRE3)如下所示:

file Gibbs kcal
RR0.out -1752.142111    -1099486.696073 
RR1.out -1752.141887    -1099486.555511 
RR4.out -1752.140564    -1099485.725315 
RR3.out -1752.140319    -1099485.571575 
RR5.out -1752.138532    -1099484.450215 
RR6.out -1752.138493    -1099484.425742 

目前,我使用的代码如下所示:

min=`awk 'BEGIN{a=0}{if ($3<0+a) a=$3} END{print a}' allRE3` 
awk 'NR == 1 { $5 = "rel" } NR >= 3 { $5 = $3 - $min } 1' < allRE3 >finalE

使用该代码,我将 finalE 作为一个新文件(这是所需的),它具有以下内容:

file Gibbs kcal  rel
RR0.out -1752.142111 -1099486.696073    
RR1.out -1752.141887 -1099486.555511  -1.09949e+06
RR4.out -1752.140564 -1099485.725315  -1.09949e+06
RR3.out -1752.140319 -1099485.571575  -1.09949e+06    

我想要得到的是下面的内容,我希望它位于一个名为“finalE”的新文件中。

file Gibbs kcal  rel
RR0.out -1752.142111 -1099486.696073  0.00000
RR1.out -1752.141887 -1099486.555511  0.140562
RR4.out -1752.140564 -1099485.725315  0.970758
RR3.out -1752.140319 -1099485.571575  1.124498

【问题讨论】:

    标签: bash awk multiple-columns subtraction negative-number


    【解决方案1】:

    awk 不是 bash(或任何其他 shell),它是一个完全不同的工具,有自己的语法、语义和变量。您不能将 shell 变量设置为一个 awk 脚本的输出值,然后在另一个 awk 脚本中使用该 shell 变量。请参阅 http://cfajohnson.com/shell/cus-faq-2.html#Q24 了解如何在 awk 脚本中使用 the value of shell 变量,但您不需要这样做,因为您应该对所有事情都使用一个 awk 脚本:

    $ cat tst.awk
    NR==FNR {
        if ( NR > 1 ) {
            min = ( (NR==2) || ($3 < min) ? $3 : min )
        }
        next
    }
    { print $0, ( FNR==1 ? "rel" : sprintf("%0.6f",$3 - min) ) }
    
    $ awk -f tst.awk file file
    file Gibbs kcal rel
    RR0.out -1752.142111    -1099486.696073  0.000000
    RR1.out -1752.141887    -1099486.555511  0.140562
    RR4.out -1752.140564    -1099485.725315  0.970758
    RR3.out -1752.140319    -1099485.571575  1.124498
    RR5.out -1752.138532    -1099484.450215  2.245858
    RR6.out -1752.138493    -1099484.425742  2.270331
    

    【讨论】:

    • 我不知道我是不是做错了什么,但是一旦我创建了tst.awk,在超级计算机上给它必要的权限,然后输入“awk -f tst.awk allRE3 " 我在任何地方都没有得到想要的输出,不是在新文件中(这是我想要发生的),也不是在旧文件中。
    • 您看到屏幕上的输出了吗?那将是预期的行为。如果是这样,请在末尾添加 &gt; newfile 以将该输出重定向到文件。
    • 不。我什么都没看到。我不知道超级计算机在解释 awk 时是否有问题,但不应该是因为它可以使用 awk 来查找最小值。有没有办法将代码嵌入到 bash 脚本中?
    • 当然可以,但是您不想弄清楚自己做错了什么,以免以后在其他工具/情况下重复吗?
    • 我们去!!明白了。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2011-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-14
    • 2013-07-20
    • 2021-11-23
    相关资源
    最近更新 更多