이것이 간격을 어떻게 정렬합니까?

이것이 간격을 어떻게 정렬합니까?

누군가 이것이 무엇을 하는지 말해 줄 수 있나요?

cat infile|
awk ' 
{
 for(i=3;i<=NF;i++){ $2=$2" "$i } 
 printf "%-4s %s\n", $1,$2 ; 
}' > outfile.txt    

infile포함하다:

1 John Smith  
2 Bill Johnson  
...
5000 George Heiz  

결과적으로 모든 선이 정렬된 것을 알 수 있지만 이 부분이 정확히 무엇을 하는지 outfile.txt이해가 되지 않습니다 .
for(i=3;i<=NF;i++){ $2=$2" "$i }

답변1

이 awk 스크립트는 복잡하고 비효율적인 접근 방식이므로 다음과 같이 다시 작성할 수 있습니다.

awk '
{
 f=$1
 $1=""
 printf "%4d %s\n",f,$0 ;
}' infile > outfile.txt

후자의 스크립트는 f 변수의 첫 번째 필드를 기록한 다음 이를 지운 다음 4자로 정렬된 f 변수를 인쇄하고 원래 줄의 나머지 부분은 변경되지 않은 채로 둡니다.

작성자가 레코드의 나머지 부분을 유지하면서 첫 번째 필드의 형식을 지정하는 방법을 파악하지 못한 것 같으므로 나머지 필드를 모두 홀수 루프를 사용하여 두 번째 필드에 넣습니다.

편집하다:

rici는 더 쉬운 방법을 제안하기도 했습니다.

awk '{$1 = sprintf("%4d", $1); print}' infile > outfile.txt

이것은 첫 번째 필드를 형식이 지정된 표현으로 바꾸고 해당 행을 출력합니다.

답변2

이러한 awk스크립트를 사용하면 무슨 일이 일어나고 있는지 확인할 수 있도록 스크립트를 분해하는 것이 항상 가장 좋습니다.

인쇄 기능

이것은 쉽습니다. 이렇게 하면 원래 열의 출력 형식이 지정 $1되고 4개의 공백을 차지하도록 $2열이 채워집니다.$1

$ cat infile | awk ' 
{
 for(i=3;i<=NF;i++){ $2=$2" "$i } 
 printf "%-4s DDD\n", $1 ; 
}'
1    DDD
2    DDD
     DDD
5000 DDD

for 루프

이것은 감지하기가 약간 까다롭지만 3 이상의 열을 가져와서 열로 연결합니다 $2.

$ cat infile | awk ' 
{
 for(i=3;i<=NF;i++){ $2=$2" "$i } 
 printf "%s | %s\n", $2,$3 ; 
}'
John Smith | Smith
Bill Johnson | Johnson
 | 
George Heiz | Heiz

이렇게 하면 약간 더 쉬워지지만 실제로 네 번째 열을 추가하면 infile훨씬 더 명확해집니다.

$ cat infile 
1 John Smith 4thcol
2 Bill Johnson 4thcol

5000 George Heiz 4thcol

$ cat infile | awk ' 
{
 for(i=3;i<=NF;i++){ $2=$2" "$i } 
 printf "%s\t|\t%s\n", $2,$3 ; 
}'
John Smith 4thcol   |   Smith
Bill Johnson 4thcol |   Johnson
    |   
George Heiz 4thcol  |   Heiz

열 5 등을 추가하면 계속해서 에 추가됩니다 $2.

답변3

형식 지정 명령을 printf첫 번째 매개변수 문자열로 전달합니다. %-4s출력에 4자가 할당되고 왼쪽 정렬됨을 나타냅니다. 그런 다음 공백이 있고 그 뒤에 로 표시되는 문자열이 옵니다 %s.

관련 정보