在bash脚本中编码旋转

在bash脚本中编码旋转,bash,Bash,我试图研究两个苯分子在不同构型下的范德华相互作用。为此,我编写了一个bash脚本,从包含这两个分子位置的文件中旋转其中一个分子(目前仅围绕x轴)。代码似乎运行时没有bug,但给出了完全错误的结果。我检查了很多次,没有发现任何“数学”错误,所以我可能在某个地方犯了语法错误? 我是bash(和linux)的初学者,因此任何帮助都将不胜感激:)! 代码如下: #!/bin/bash echo "Angle of rotation (in rad:" read angle echo "File or

我试图研究两个苯分子在不同构型下的范德华相互作用。为此,我编写了一个bash脚本,从包含这两个分子位置的文件中旋转其中一个分子(目前仅围绕x轴)。代码似乎运行时没有bug,但给出了完全错误的结果。我检查了很多次,没有发现任何“数学”错误,所以我可能在某个地方犯了语法错误? 我是bash(和linux)的初学者,因此任何帮助都将不胜感激:)! 代码如下:

#!/bin/bash

echo "Angle of rotation (in rad:"
read angle
echo "File or path to file :"
read fichier
echo "Your file:"
cat $fichier
echo "Give the line numbers which contain the atoms you want to rotate :"
read ligneDebut
read ligneFin

# creation of an associative array playing the role of the rotation matrix
declare -A Rx 
Rx=([1,1]=1 [1,2]=0 [1,3]=0 [2,1]=0 [2,2]=`echo "c($angle)" | bc -l` [2,3]=`echo "-s($angle)" | bc -l` [3,1]=0 [3,2]=`echo "s($angle)" | bc -l` [3,3]=`echo "c($angle)" | bc -l`)

#storage of the atomic positions in an array
declare -A posAtomes
for((i=$ligneDebut; i<=$ligneFin; i++)) do
    for((j=1; j<4; j++)) do
        posAtomes[$i,$j]=`awk -v ligne=$i -v colonne=$j '{if(NR==ligne) print $(colonne+1)}' $fichier` 
    done
done

#computation of the new positions after rotation
declare -A newPos
for((i=$ligneDebut; i<=$ligneFin; i++)) do
    for((j=1; j<4; j++)) do
        newPos[$i,$j]=`echo "${posAtomes[$i,1]} * ${Rx[$j,1]} + ${posAtomes[$i,2]} * ${Rx[$j,2]} + ${posAtomes[$i,3]} * ${Rx[$j,3]}" | bc -l`
    done
done

#writing the new positions in the original file
for ((i=$ligneDebut; i<=$ligneFin; i++)) do
    for ((j=1;j<4;j++)) do
        awk -v ligne=$i -v colonne=$j -v val=${newPos[$i,$j]} '{if(NR==ligne) {$(colonne+1)=val; print $0} else print $0}' $fichier > tmp && mv tmp $fichier
    done
done

如果你知道我做错了什么。。。提前谢谢

我可以提供一些基本的故障排除步骤,尽管我不熟悉确切的计算

0)若要获得更详细的帮助,请尝试发布输入的示例输入(旋转角度和行号)、预期结果以及看到的结果。此外,添加您试图实现的公式可能会有所帮助

1) 尝试添加许多简单的echo语句来查看各个步骤的进度:调试语句。例如:

echo "Angle of rotation (in rad:"
read angle
echo "OK, operating with angle: "${angle}

echo "File or path to file :"
read fichier
echo "OK, input file is: "${fichier}
在我看来,这两个步骤在您的程序中是正确的。但是,希望该方法能为您提供进一步的调试步骤。在整个代码中添加这些调试echo语句,以输出中间值并验证它们是否按预期工作


快乐黑客。另外,您使用bash实现这一点有什么特别的原因吗?也许另一种语言,例如带有内置向量数学库的语言(Python、R、Matlab…)更合适。

我可以提供一些基本的故障排除步骤,尽管我不熟悉确切的计算

0)若要获得更详细的帮助,请尝试发布输入的示例输入(旋转角度和行号)、预期结果以及看到的结果。此外,添加您试图实现的公式可能会有所帮助

1) 尝试添加许多简单的echo语句来查看各个步骤的进度:调试语句。例如:

echo "Angle of rotation (in rad:"
read angle
echo "OK, operating with angle: "${angle}

echo "File or path to file :"
read fichier
echo "OK, input file is: "${fichier}
在我看来,这两个步骤在您的程序中是正确的。但是,希望该方法能为您提供进一步的调试步骤。在整个代码中添加这些调试echo语句,以输出中间值并验证它们是否按预期工作


快乐黑客。另外,您使用bash实现这一点有什么特别的原因吗?也许另一种语言,例如带有内置向量数学库的语言(Python、R、Matlab…)更合适。

谢谢您的回复!我以为我已经做了“到处放回声”的事情,但我做得不好。我发现了错误:bc无法处理科学记数法(对于一个有点蹩脚的计算器来说),因此必须使用sed或awk在10^01之前重新绘制所有的E+01。该死,我在这件事上浪费了这么多时间!下次我会用Python哈哈

谢谢你的回复!我以为我已经做了“到处放回声”的事情,但我做得不好。我发现了错误:bc无法处理科学记数法(对于一个有点蹩脚的计算器来说),因此必须使用sed或awk在10^01之前重新绘制所有的E+01。该死,我在这件事上浪费了这么多时间!下次我将使用Python哈哈

既然你说你是
bash
的初学者,我将借此机会建议你使用另一种语言来完成这类任务
bash
有许多优点,但实现算术运算的容易性并不是其中之一。如果您正在寻找在每台linux机器上都可用的通用语言,我认为
python
将是一个不错的选择。更专业的语言包括Mathematica和Matlab/Octave。既然你说你是
bash
的初学者,我将借此机会建议你使用另一种语言来完成这类任务
bash
有许多优点,但实现算术运算的容易性并不是其中之一。如果您正在寻找在每台linux机器上都可用的通用语言,我认为
python
将是一个不错的选择。更专业的语言将包括Mathematica和Matlab/Octave。使用
bash-x
调用脚本(或在脚本中添加
set-x
命令)是添加大量
echo
的更简单的替代方法,尽管极其详细的输出可能会关闭,这只会显示正在运行的行,对吗?我建议显示每个步骤的输出,例如变量的值。基本上是一步一步地调试。;-)它向您显示正在运行的命令,这更接近于一步一步,因为它将在多个步骤中分解组合的命令,并显示每个后续步骤与前一步骤的结果一起工作。我刚刚注意到它在
read
中不太适用,但是对于标准变量矫揉造作,它将显示变量的有效值,而不是表达式,这与在该步骤之后添加额外的回显效果相同。使用
bash-x
调用脚本(或在脚本中添加
set-x
命令)IMO是添加大量的
echo
的一个更简单的替代方案吗?尽管极其详细的输出可能会显示出哪一行正在运行,对吗?我建议显示每个步骤的输出,例如变量的值。基本上是一步一步地调试。;-)它向您显示正在运行的命令,这更接近于一步一步,因为它将在多个步骤中分解组合的命令,并显示每个后续步骤与前一步骤的结果一起工作。我只是注意到它在
read
中不会很好地工作,但是对于标准变量矫揉造作,它将显示变量的有效值,而不是表达式,这与在该步骤之后添加一个额外的回显具有相同的效果。