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의 대답은 내가 예상했던 것보다 훨씬 좋았습니다. 하지만 내 구성 중 한 가지는 열이 너무 길면 자르는 것입니다. 나는 그의 솔루션을 사용하여 이를 달성할 수 있었습니다.

입력하다

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

관련 정보