BASH скриптинг: организация вывода вложенного l oop в таблицу - PullRequest
0 голосов
/ 13 февраля 2020

Я потратил так много времени на это, надеюсь, кто-нибудь сможет мне помочь. Я редактирую сценарий, который используется для отправки значений в исполняемый файл, а затем очищает вывод из исполняемого файла для табуляции. Я создал два массива, которые заполнены введенными пользователем диапазонами, затем эти диапазоны используются для создания вложенного l oop, который я поместил в функцию (поскольку мне нужно создать 4 файла из вывода в зависимости от другого значения). Я признаю, что мой код ужасен, но он выполняет первостепенную задачу, а именно получает необходимые мне данные и помещает их в правильный файл. Все, что я пытаюсь сделать, это заставить его создать таблицу с метками строк и столбцов, я просто не могу понять, почему это так сложно. Это проблемная c область:

# 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

1 Ответ

0 голосов
/ 13 февраля 2020

Общая идея заключается в замене команд echo сопоставимыми командами printf на форматы, соответствующие форматам, используемым для печати первой строки / строки заголовка ...

Начните с замены echo "$i" с printf "%22s" "$i" => это должно оставить курсор на той же строке, что и $i и выровнено под 2.0000e+00

После того, как вы закончите sh j l oop и до получения следующее i do printf "\n" => это должно переместить курсор на следующую строку и быть готовым к следующему printf "%22s" "$i".

Это должно начать вас.

Если что-то не так не выстраивайтесь в линию, тогда подумайте о замене echo -ne "\tRATEF" на printf "%#s" "$RATEF" (отрегулируйте число #, чтобы выровнять вывод по желанию).

...