使用bash声明一个最小值后不能减去负数
我正在编辑的脚本从近100个文件中提取数据,并将其汇集到单个文件中。我现在正在尝试处理这些数据。我可以毫无问题地提取和汇集数据,我的问题出现在处理数据的时候 我试着做两件事。我想在第3列中找到负数的最小值,然后从第3列中的每个值中减去该最小值,并将结果打印在一个名为“rel”的新列中。目前,我正在成功地找到最小值,但我无法使减法生效 我的输入文件(标题为allRE3)如下所示:使用bash声明一个最小值后不能减去负数,bash,awk,multiple-columns,subtraction,negative-number,Bash,Awk,Multiple Columns,Subtraction,Negative Number,我正在编辑的脚本从近100个文件中提取数据,并将其汇集到单个文件中。我现在正在尝试处理这些数据。我可以毫无问题地提取和汇集数据,我的问题出现在处理数据的时候 我试着做两件事。我想在第3列中找到负数的最小值,然后从第3列中的每个值中减去该最小值,并将结果打印在一个名为“rel”的新列中。目前,我正在成功地找到最小值,但我无法使减法生效 我的输入文件(标题为allRE3)如下所示: file Gibbs kcal RR0.out -1752.142111 -1099486.696073 RR
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
目前,我使用的代码如下所示:
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
我想得到的是下面,我想它是在一个新的文件名为“终局”
awk不是bash(或任何其他shell),它是一个完全不同的工具,具有自己的语法、语义和变量。不能将shell变量设置为一个awk脚本的ouytput值,然后在另一个awk脚本中使用该shell变量。有关如何在awk脚本中使用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
$cat tst.awk
NR==FNR{
如果(NR>1){
最小值=((NR==2)| |($3awk不是bash(或任何其他shell),它是一个完全不同的工具,具有自己的语法、语义和变量。不能将shell变量设置为一个awk脚本的ouytput值,然后在另一个awk脚本中使用该shell变量。有关如何在awk脚本中使用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
$cat tst.awk
NR==FNR{
如果(NR>1){
最小值=((NR==2)| |($3
我不知道我是否做得不对,但一旦我创建了tst.awk,给它在超级计算机上的必要权限,然后输入“awk-f tst.awk allRE3”,我就不会在任何地方得到所需的输出,无论是在新文件中(这是我想要的),还是在旧文件中。你看到屏幕上的输出了吗?这将是预期的行为。如果是这样,请在末尾添加>newfile
,以将该输出重定向到file.Nope。我什么也没看到。我不知道超级计算机是否在解释awk时遇到问题,但不应该是因为它可以使用awk来找到最小值。有没有办法将代码嵌入到bash脚本中?当然可以,但您不想知道自己做错了什么,这样以后就不会在其他工具/情况下重复代码了吗?好了!!明白了。谢谢。我不知道我是否做得不对,但一旦我创建了tst.awk,给它在超级计算机上的必要权限,然后输入“awk-f tst.awk allRE3”,我就不会在任何地方得到所需的输出,无论是在新文件中(这是我想要的),还是在旧文件中。你看到屏幕上的输出了吗?这将是预期的行为。如果是这样,请在末尾添加>newfile
,以将该输出重定向到file.Nope。我什么也没看到。我不知道超级计算机是否在解释awk时遇到问题,但不应该是因为它可以使用awk来找到最小值。有没有办法将代码嵌入到bash脚本中?当然可以,但您不想知道自己做错了什么,这样以后就不会在其他工具/情况下重复代码了吗?好了!!明白了。非常感谢。