在bash脚本中编码旋转
我试图研究两个苯分子在不同构型下的范德华相互作用。为此,我编写了一个bash脚本,从包含这两个分子位置的文件中旋转其中一个分子(目前仅围绕x轴)。代码似乎运行时没有bug,但给出了完全错误的结果。我检查了很多次,没有发现任何“数学”错误,所以我可能在某个地方犯了语法错误? 我是bash(和linux)的初学者,因此任何帮助都将不胜感激:)! 代码如下:在bash脚本中编码旋转,bash,Bash,我试图研究两个苯分子在不同构型下的范德华相互作用。为此,我编写了一个bash脚本,从包含这两个分子位置的文件中旋转其中一个分子(目前仅围绕x轴)。代码似乎运行时没有bug,但给出了完全错误的结果。我检查了很多次,没有发现任何“数学”错误,所以我可能在某个地方犯了语法错误? 我是bash(和linux)的初学者,因此任何帮助都将不胜感激:)! 代码如下: #!/bin/bash echo "Angle of rotation (in rad:" read angle echo "File or
#!/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
中不会很好地工作,但是对于标准变量矫揉造作,它将显示变量的有效值,而不是表达式,这与在该步骤之后添加一个额外的回显具有相同的效果。