텍스트 출력에서 ​​열을 생성하지만 여러 단어 열이 있음

텍스트 출력에서 ​​열을 생성하지만 여러 단어 열이 있음

다음과 같은 출력이 있습니다.

Person 49 
Persons Boss 3
HR 21 
CEO 93
System Administrator 2

을 사용하면 column -t다음과 같은 출력이 생성됩니다.

Person   49
Persons  Boss           3
HR       21
CEO      93
System   Administrator  2

보시다시피 이것은 좋아 보이지 않습니다. 다음과 같은 출력이 필요합니다.

Person               49
Persons Boss          3 
HR                   21
CEO                  93
System Administrator  2

이게 어떻게 생산되는지 아는 사람 있나요?

답변1

Tab예를 들어 열 구분 기호를 다음과 같이 변경하십시오 column.

output | sed 's/\S\+\s*$/\t&/' | column -t -s $'\t'

답변2

다음은 필요한 열 너비를 동적으로 결정하는 awk의 솔루션입니다. 각 행에는 원하는 수의 필드가 포함될 수 있지만 최종 필드는 정수라고 가정합니다. 정수는 필요에 따라 오른쪽에 정렬되도록 형식이 지정됩니다.

형식.awk

#!/usr/bin/awk -f

# Format text and numbers into two columns
# Written by PM 2Ring 2015.04.16

#Gather data, line by line
{
    #Split name from number
    match($0, /^(.*) ([0-9]+)[[:space:]]*$/, a)
    #printf "%d: %s -> [%s] [%s]\n", NR, $0, a[1], a[2]

    #Store name & number into arrays
    name[NR] = a[1]
    num[NR] = a[2]

    #Update field widths
    namelen = length(a[1])
    if (namelen > maxname) 
        maxname = namelen

    numlen = length(a[2])
    if (numlen > maxnum) 
        maxnum = numlen
}

#Print re-formatted data
END{
    for(i=1; i<=NR; i++)
        #Use printf's '*' modifier to specify field widths 
        printf "%-*s %*d\n", maxname, name[i], maxnum, num[i]
}

산출

Person               49
Persons Boss          3
HR                   21
CEO                  93
System Administrator  2

다음과 같이 스크립트를 호출할 수 있습니다.

$ awk -f format.awk data_filename

텍스트 데이터를 파이프로 연결할 수도 있습니다. 를 사용하여 실행 권한을 부여 하면 chmod다른 명령처럼 실행할 수 있습니다.

분명히 이것은 Costa의 솔루션보다 낫습니다( sed전처리 용 column). 따라서 다음과 같은 경우가 아니면 사용하는 것이 좋습니다.진짜숫자를 오른쪽으로 정렬하고 싶습니다. :) OTOH, 이 스크립트는것 같다Costa의 한 줄짜리 솔루션보다 더 크고 매우 빠르기 때문에 awk데이터 파일이 매우 크더라도 이 솔루션의 속도는 Costa의 솔루션과 비슷할 것으로 기대됩니다.

답변3

마지막으로 보관된 변수를 새 변수에 저장한 다음 해당 원시 포인터를 빈 문자열로 설정하고 $0과 저장한 마지막 보관된 변수를 인쇄하면 한 줄에서 이 작업을 수행할 수 있습니다.

(echo a b c 10; echo x y 2 ; echo x 1) \
       | awk '{lastf=$NF ; $NF="" ; print $0,", "lastf}' \
       | column -ts,

# output
a b c     10
x y       2
x         1

관련 정보