Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用bash声明一个最小值后不能减去负数_Bash_Awk_Multiple Columns_Subtraction_Negative Number - Fatal编程技术网

使用bash声明一个最小值后不能减去负数

使用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

我正在编辑的脚本从近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
目前,我使用的代码如下所示:

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脚本中?当然可以,但您不想知道自己做错了什么,这样以后就不会在其他工具/情况下重复代码了吗?好了!!明白了。非常感谢。