printfを使用してフィールドをソートする方法

printfを使用してフィールドをソートする方法

次の構文は出力1を出力します。

echo "$status" 

出力1:

    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

答え1

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文字を予約します。20希望のフォーマットに合わせてsを調整します。


この質問の以前のバージョンでは、をsed使用してフィルタリングしてさまざまな変換を実行しましたgrep。これはawk同じスクリプトのソースファイルから直接行うこともできます。または、ファイルがJSONファイルの場合(コメントで述べたように)、jq同じファイルから直接。

答え2

Kosalonandaの答えは、私が予想したものよりはるかに良かったです。しかし、私の構成の1つは、熱が長すぎると切断することです。私は彼の解決策を使ってこれを達成することができました。

入力する

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

関連情報