我在此上浪费了很多时间,希望有人可以帮助我。我正在编辑一个脚本,该脚本用于将值发送到可执行文件,然后清除可执行文件的输出以进行制表。我创建了两个数组,其中填充了用户输入的范围,然后将这些范围用于创建嵌套循环,并将其放入函数中(因为我需要根据输出值创建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 "%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 $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
一般的想法是,用与打印第一行/标题行的格式相匹配的格式,将echo
命令替换为可比较的printf
命令...
[用echo "$i"
替换printf "%22s" "$i"
开始=>这将使光标与$i
在同一行并在2.0000e+00
下对齐
完成j
循环之后并获得下一个i
之前执行printf "\n"
=>,这应将光标移至下一行并为下一个printf "%22s" "$i"
作好准备。
那应该让您入门。
如果排列不正确,请考虑将echo -ne "\tRATEF"
替换为printf "%#s" "$RATEF"
(调整数字#以根据需要排列输出)。