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

问题描述 投票:0回答:1

我在此上浪费了很多时间,希望有人可以帮助我。我正在编辑一个脚本,该脚本用于将值发送到可执行文件,然后清除可执行文件的输出以进行制表。我创建了两个数组,其中填充了用户输入的范围,然后将这些范围用于创建嵌套循环,并将其放入函数中(因为我需要根据输出值创建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
arrays bash printf echo
1个回答
0
投票

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

[用echo "$i"替换printf "%22s" "$i"开始=>这将使光标与$i在同一行并在2.0000e+00下对齐

完成j循环之后并获得下一个i之前执行printf "\n" =>,这应将光标移至下一行并为下一个printf "%22s" "$i"作好准备。

那应该让您入门。

如果排列不正确,请考虑将echo -ne "\tRATEF"替换为printf "%#s" "$RATEF"(调整数字#以根据需要排列输出)。

© www.soinside.com 2019 - 2024. All rights reserved.