BASH 脚本:将嵌套循环的输出组织成 table
BASH scripting: Organizing output of a nested loop into a table
我在这上面浪费了很多时间,希望有人能帮助我。我正在编辑一个脚本,该脚本用于将值发送到 executable,然后擦除 executable 的输出以进行制表。我创建了两个数组,其中填充了用户输入的范围,然后使用这些范围创建一个嵌套循环,我将其放入函数中(因为我需要根据另一个值从输出创建 4 个文件)。我承认我的代码很糟糕,但它做了主要的事情,那就是获取我需要的数据并将其放入正确的文件中。我想要做的就是让它实际制作一个带有行和列标签的 table,我只是不明白为什么这如此困难。
这是有问题的区域:
# 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 "%s\n" "${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 >> 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
命令,其格式与用于打印 first/header 行的格式相匹配 ...
首先将 echo "$i"
替换为 printf "%22s" "$i"
=> 这应该使光标与 $i
在同一行并排在 2.0000e+00
[=22= 下方]
完成 j
循环后,在获取下一个 i
之前执行 printf "\n"
=> 这应该将光标移动到下一行并为下一个 [=13] 做好准备=].
这应该让你开始。
如果情况不太对,请考虑将 echo -ne "\tRATEF"
替换为 printf "%#s" "$RATEF"
(调整数字 # 以根据需要排列输出)。
我在这上面浪费了很多时间,希望有人能帮助我。我正在编辑一个脚本,该脚本用于将值发送到 executable,然后擦除 executable 的输出以进行制表。我创建了两个数组,其中填充了用户输入的范围,然后使用这些范围创建一个嵌套循环,我将其放入函数中(因为我需要根据另一个值从输出创建 4 个文件)。我承认我的代码很糟糕,但它做了主要的事情,那就是获取我需要的数据并将其放入正确的文件中。我想要做的就是让它实际制作一个带有行和列标签的 table,我只是不明白为什么这如此困难。 这是有问题的区域:
# 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 "%s\n" "${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 >> 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
命令,其格式与用于打印 first/header 行的格式相匹配 ...
首先将 echo "$i"
替换为 printf "%22s" "$i"
=> 这应该使光标与 $i
在同一行并排在 2.0000e+00
[=22= 下方]
完成 j
循环后,在获取下一个 i
之前执行 printf "\n"
=> 这应该将光标移动到下一行并为下一个 [=13] 做好准备=].
这应该让你开始。
如果情况不太对,请考虑将 echo -ne "\tRATEF"
替换为 printf "%#s" "$RATEF"
(调整数字 # 以根据需要排列输出)。