Как выровнять поля с помощью printf

следующий синтаксис print the output1 down

echo "$status" 

output1:

    component_name : TEZ_CLIENT     recovery_enabled : true
    component_name : WEBHCAT_SERVER         recovery_enabled : true
    component_name : YARN_CLIENT            recovery_enabled : true
    component_name : ZKFC           recovery_enabled : true
    component_name : ZOOKEEPER_CLIENT             recovery_enabled : true
    component_name : ZOOKEEPER_SERVER                      recovery_enabled : true

как добавить синтаксис printf, чтобы получить следующие строки:

ожидаемый результат

    component_name : TEZ_CLIENT             recovery_enabled : true
    component_name : WEBHCAT_SERVER         recovery_enabled : true
    component_name : YARN_CLIENT            recovery_enabled : true
    component_name : ZKFC                   recovery_enabled : true
    component_name : ZOOKEEPER_CLIENT       recovery_enabled : true
    component_name : ZOOKEEPER_SERVER       recovery_enabled : true
-2
10.09.2017, 20:54
2 ответа

Ответ Кусалананды намного лучше, чем я думал. Одна вещь, которую я имел в своей конструкции, — это условие для усечения столбца, если он слишком длинный. Я смог реализовать это с помощью его решения :

.

ВХОД

component_name : TEZ_CLIENT     recovery_enabled : true
component_name : WEBHCAT_SERVER         recovery_enabled : true
component_name : YARN_CLIENT            recovery_enabled : true
component_name : ZKFC           recovery_enabled : true
component_name : ZOOKEEPER_CLIENT             recovery_enabled : true
component_name : ZOOKEEPER_SERVER                      recovery_enabled : true
component_name : ZOOKEEPER_SERVER_1234567890                      recovery_enabled : true

СЦЕНАРИЙ

# /bin/bash -
#
INPUT_FILE=$HOME/Documents/scripts/shell/testing/input
IFS= mapfile -t STATUS_ARRAY < <(cat "$INPUT_FILE" | tr -s " ")
for line in "${STATUS_ARRAY[@]}"; do
    COMPONENT_NAME=$(echo "$line" | awk '{print $3}')
    if [[ "${#COMPONENT_NAME}" -gt "16" ]]; then
        echo "$line" | sed "s/${COMPONENT_NAME}/${COMPONENT_NAME:0:16}../" | awk '{printf("%s %s %-20s %20s %s %s\n", $1, $2, $3, $4, $5, $6)}'
    else
        echo "$line" | awk '{printf("%s %s %-20s %20s %s %s\n", $1, $2, $3, $4, $5, $6)}'
    fi
done

Мой скрипт извлекает данные из файла, но вы, скорее всего, также можете установить файл карты с помощью echo $status | grep..илиecho $status | jq..

ВЫХОД

component_name : TEZ_CLIENT               recovery_enabled : true
component_name : WEBHCAT_SERVER           recovery_enabled : true
component_name : YARN_CLIENT              recovery_enabled : true
component_name : ZKFC                     recovery_enabled : true
component_name : ZOOKEEPER_CLIENT         recovery_enabled : true
component_name : ZOOKEEPER_SERVER         recovery_enabled : true
component_name : ZOOKEEPER_SERVER..       recovery_enabled : true
0
28.01.2020, 05:15
echo "$status" | awk '{printf("%s %s %-20s %20s %s %s\n", $1, $2, $3, $4, $5, $6)}'

Будет производиться

component_name : TEZ_CLIENT               recovery_enabled : true
component_name : WEBHCAT_SERVER           recovery_enabled : true
component_name : YARN_CLIENT              recovery_enabled : true
component_name : ZKFC                     recovery_enabled : true
component_name : ZOOKEEPER_CLIENT         recovery_enabled : true
component_name : ZOOKEEPER_SERVER         recovery_enabled : true

Формат %-20sрезервирует 20 символов для строки с выравниванием по левому краю -, а формат %20sрезервирует 20 символов для строки с выравниванием по правому краю -. Отрегулируйте 20s в соответствии с желаемым форматом.


В предыдущем воплощении этого вопроса у вас были различные преобразования с использованием sedи фильтрация с помощью grep. Вполне вероятно, что это также можно сделать в том же скрипте awkнепосредственно из исходного файла. Или, если файл представляет собой файл JSON (, как вы говорите в комментариях ), непосредственно jqиз того же файла.

5
28.01.2020, 05:15

Теги

Похожие вопросы