使用 bash 声明一个最小值后不能减去负数
Cannot subtract negative numbers after declaring one a minimum using bash
我正在编辑的脚本从近 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 (<0+a) a=} END{print a}' allRE3`
awk 'NR == 1 { = "rel" } NR >= 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
awk 不是 bash(或任何其他 shell),它是一个完全不同的工具,有自己的语法、语义和变量。您不能将 shell 变量设置为一个 awk 脚本的输出值,然后在另一个 awk 脚本中使用该 shell 变量。请参阅 http://cfajohnson.com/shell/cus-faq-2.html#Q24 以了解如何在 awk 脚本中使用 的值 shell 变量,但您不需要这样做,因为您应该只使用一个一切的 awk 脚本:
$ cat tst.awk
NR==FNR {
if ( NR > 1 ) {
min = ( (NR==2) || ( < min) ? : min )
}
next
}
{ print [=10=], ( FNR==1 ? "rel" : sprintf("%0.6f", - 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
我正在编辑的脚本从近 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 (<0+a) a=} END{print a}' allRE3`
awk 'NR == 1 { = "rel" } NR >= 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
awk 不是 bash(或任何其他 shell),它是一个完全不同的工具,有自己的语法、语义和变量。您不能将 shell 变量设置为一个 awk 脚本的输出值,然后在另一个 awk 脚本中使用该 shell 变量。请参阅 http://cfajohnson.com/shell/cus-faq-2.html#Q24 以了解如何在 awk 脚本中使用 的值 shell 变量,但您不需要这样做,因为您应该只使用一个一切的 awk 脚本:
$ cat tst.awk
NR==FNR {
if ( NR > 1 ) {
min = ( (NR==2) || ( < min) ? : min )
}
next
}
{ print [=10=], ( FNR==1 ? "rel" : sprintf("%0.6f", - 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