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"(调整数字 # 以根据需要排列输出)。