awk를 사용하여 텍스트 정렬

awk를 사용하여 텍스트 정렬

줄의 텍스트 간격이 균등하고 왼쪽과 오른쪽으로 정렬되도록 출력 파일의 형식을 지정하려고 합니다. 왼쪽 및 오른쪽 정렬을 수행하는 것은 쉽지 않지만 awk를 사용하여 왼쪽 및 오른쪽 정렬을 어떻게 수행합니까?

편집하다

입력하다:

This is a text
that is
not distributed
evenly in a file

원하는 출력은 다음과 같아야 합니다.

This  is  a text
that          is
not  distributed
evenly in a file

답변1

대상 너비를 미리 알고 있다면 각 줄의 공백을 재분배하여 기본적인 정당화를 얻을 수 있습니다.

#!/usr/bin/awk -f

BEGIN {
    if (width == 0) width = 80
}

NF <= 1 { print }

NF > 1 {
    nbchar = 0
    for (i = 1; i <= NF; i++) {
        nbchar += length($i)
    }
    nbspc = width - nbchar
    spcpf = int(nbspc / (NF - 1))
    for (i = 1; i < NF; i++) {
        printf $i
        spaces = (NF == 2 || i == NF - 1) ? nbspc : spcpf
        if (spaces < 1) spaces = 1
        for (j = 0; j < spaces; j++) {
            printf " "
        }
        nbspc -= spaces
    }
    print $NF
}

(기본 너비는 80입니다. override를 사용하세요 -v width=...).

작동 방식은 다음과 같습니다.

  • 필드가 없거나 필드가 하나만 있는 행은 있는 그대로 출력됩니다.
  • 두 개 이상의 필드가 있는 각 행을 처리합니다.
    • nbchar필드 구분 기호가 아닌 문자( ) 의 수를 계산합니다 .
    • 할당할 공간의 양을 결정합니다( ncspc).
    • 이를 필드 수에서 1을 뺀 값으로 나누어 각 필드 사이에 인쇄할 공백 수를 구합니다( 에서는 반올림됨 spcpf).
    • spcpf마지막 필드를 제외한 모든 필드가 인쇄됩니다. 그런 다음 적절한 수의 공백이 인쇄됩니다 . 두 개의 필드만 있는 줄이 없거나 끝에서 두 번째 필드를 인쇄하는 경우가 아니면 항상 최소한 하나가 있는지 확인하고 선택합니다. 이 경우 남은 공간 수에 관계없이( nbspc추적을 유지하도록 조정);
    • 마지막으로 마지막 필드를 인쇄하고 새 줄로 묶습니다.

기존 텍스트의 너비를 대상으로 지정하려면 width다음과 같이 초기화하세요.

awk 'length > max { max = length }; END { print max }'

(입력 스트림을 재설정하는 확실한 방법은 없습니다. awk언제든지 파일임을 지정하고 이에 따라 스크립트를 조정할 수 있습니다.)

이것은 생산할 것입니다

This is a   text
that          is
not  distributed
evenly in a file

너비 16(기존 텍스트의 너비) 또는

This   is   a   text
that              is
not      distributed
evenly  in  a   file

너비가 20이거나

This is a text
that      is
not distributed
evenly in a file

너비는 12입니다(그러면 행이 오버플로됩니다).

답변2

여기요.

    cat file1.txt 
    This is a text
    that is
    not distributed
    evenly in a file

"행 간격이 균등하다"고 말했으므로 "\t" 탭 구분 기호를 삽입하면 됩니다.

   cat file1.txt | awk '{print $1 "\t" $2 "\t" $3  "\t" $4 }'

 > file2.txt 

결과:

    cat file2.txt 
    This    is  a   text
    that    is      
    not distributed     
    evenly  in  a   file

관련 정보