줄의 텍스트 간격이 균등하고 왼쪽과 오른쪽으로 정렬되도록 출력 파일의 형식을 지정하려고 합니다. 왼쪽 및 오른쪽 정렬을 수행하는 것은 쉽지 않지만 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