누군가 이것이 무엇을 하는지 말해 줄 수 있나요?
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
.