BASH 脚本:将嵌套循环的输出组织到表中



我浪费了很多时间,希望有人能帮助我。我正在编辑一个脚本,该脚本用于将值发送到可执行文件,然后从可执行文件中清理输出以进行制表。我创建了两个填充了用户输入范围的数组,然后这些范围用于创建一个嵌套循环,我已将其放入函数中(因为我需要根据另一个值从输出中创建 4 个文件(。我承认我的代码很糟糕,但它做了主要的事情,那就是获取我需要的数据并放入正确的文件中。我要做的就是让它真正制作一个带有行和列标签的表格,我只是不明白为什么这如此困难。 这是有问题的领域:

# Function to loop user inputted ranges in order to generate report data.
function repeat()
{
printf "%22s" 'density (10^18 m^-3)' 
for a in "${density_array[@]}"  # for loop to list density values in the range set by the user.
do
printf "%13s" "$a"
done
echo -e "n" 'speed (m/s)'
#printf "%sn" "${speed_array[@]}"
for i in "${speed_array[@]}"
do 
echo "$i"
for j in "${density_array[@]}"
do
echo $j > SCATINPUT     # generates a temporary file named SCATINPUT, with density value as first line.
echo $temp >> SCATINPUT # appends a new line with temperature value to SCATINPUT file.
echo $i >> SCATINPUT    # appends a new line with speed value to SCATINPUT file.
echo $1 >> SCATINPUT    # appends a new line with rate type from argument to SCATINPUT file.
# pipes contents of SCATINPUT file to executable, extracts  value from STDOUT to RATE variable.
RATE=`path_of_executable < SCATINPUT | awk '/0./'` 
RATEF=$(printf "%.4e" $RATE)    # converts number in RATE variable to scientific notation with 4 digits after decimal and sets RATEF variable.
echo -ne "t$RATEF"
rm -f SCATINPUT # quietly deletes SCATINPUT file.
done
done
}

我在文件中获得此输出:

density (10^18 m^-3)   2.0000e+00   4.0000e+00   6.0000e+00
speed (m/s)
8.0000e+06
7.6164e+04  1.4849e+05  2.1936e+059.0000e+06
5.7701e+04  1.1249e+05  1.6619e+051.0000e+07
4.3469e+04  8.4747e+04  1.2520e+051.1000e+07
3.3078e+04  6.4488e+04  9.5269e+041.2000e+07
2.5588e+04  4.9886e+04  7.3697e+04

但它应该是这样的:

density (10^18 m^-3)   2.0000e+00   4.0000e+00   6.0000e+00
speed (m/s)
8.0000e+06             7.6164e+04   1.4849e+05  2.1936e+05
9.0000e+06             5.7701e+04   1.1249e+05  1.6619e+05
1.0000e+07             4.3469e+04   8.4747e+04  1.2520e+05
1.1000e+07             3.3078e+04   6.4488e+04  9.5269e+04
1.2000e+07             2.5588e+04   4.9886e+04  7.3697e+04

一般的想法是用可比较的printf命令替换echo命令,其格式与用于打印第一行/标题行的格式相匹配......

首先将echo "$i"替换为printf "%22s" "$i"=>这应该使光标与$i在同一行上,并在2.0000e+00下排列

完成j循环后,在获取下一个i之前,执行printf "n"=>这应该将光标移动到下一行并为下一个printf "%22s" "$i"做好准备。

这应该让你开始。

如果事情不太正确,请考虑用printf "%#s" "$RATEF"替换echo -ne "tRATEF"(根据需要调整数字#以对齐输出(。

最新更新