나는 이 명령을 안다
awk '{for(x=1;$x;++x)print $x}'
행의 모든 열을 인쇄합니다.
이것이 2로 ++x
변경되어 먼저 인쇄 되지 않습니까 ? 제가 이해한 바에 따르면 다음과 같습니다.x
$2
https://stackoverflow.com/questions/1812990/incrementing-in-c-when-to-use-x-or-x
$x
기능은 무엇입니까 for(x=1;$x;++x)
?
답변1
아니요. 이는 for(i=0;i<10;i++)
고전적인 프로그래밍 구조입니다(참조:전통적인 for 루프)은 다양한 언어로 존재합니다. 이는 다음과 같이 분류될 수 있습니다.
start-expression; end-condition; end-of-iteration-expression
즉, 위에서 쓴 것은 "i를 0으로 초기화하고, i가 10보다 작을 때 뭔가를 한 다음,그 다음에i에 1을 더합니다. 예, 구문은 혼란스럽습니다. 하지만 그게 전부입니다. end-of-iteration-expression
( ++x
이 경우) 각 루프가 끝날 때마다 한 번. 다음과 같이 작성하는 것과 같습니다.
while(i<10){print i; ++i}
에 관해서는 $x
해당 숫자에 대한 필드가 존재하고 해당 내용이 false로 평가되지 않는지 확인하는 것뿐입니다(Mathias의 설명대로).다음 사항에 답해 보세요.). $N
필드 번호 N이 존재하고 N 유형이 아닌 경우 true를 반환합니다 false
. 예를 들어:
$ echo "a b c d" | awk '($4){print "yes"}'
yes
$ echo "a b c d" | awk '($14){print "yes"}' ## prints nothing, no $14
$ echo "a b c 0" | awk '($4){print "yes"}' ## prints nothing, $4 is 0
위에서 볼 수 있듯이 첫 번째 명령은 yes
하나가 있기 때문에 인쇄됩니다 $4
. $14
두 번째 명령은 없기 때문에 아무것도 인쇄하지 않습니다. 그럼 원래의 예로 돌아가서:
awk '{for(x=1;$x;x++)print $x}'
___ __ ___
| | |
| | |-----> increment x by 1 at the end of each loop.
| |--------> run the loop as long as there is a field number x
|------------> initialize x to 1
답변2
terdon이 포괄적인 답변을 제공했기 때문에 다음 예제에서 볼 수 있듯이 열이 false로 평가되면 for 문이 루프를 종료한다는 점을 추가하고 싶습니다.
$ echo 1 2 3 4 5 0 6|awk '{for(x=1;$x;++x)print $x}'
1
2
3
4
5
답변3
++x
x++
개별적으로 사용하면 기능적으로 동일합니다. 귀하가 인용한 스택 오버플로 질문에서 논의한 바와 같이,- 이있을 수 있습니다성능(즉, 시간) 차이.
something = ++x;
의 결과something = x++;
는 다르지만 귀하의 예는 그렇지 않습니다.
따라서 증가 측면에서
x
귀하의 예는 다음과 같습니다.awk '{for(x=1;$x;엑스++) $x}'를 인쇄하세요
독립 실행형
$x
은 동일하므로$x != ""
빈 필드가 나타날 때까지 루프가 반복됩니다. 이는 현재 레코드(행)의 필드 수가x <= NF
어디에 있는지에 대한 게으른 지름길입니다 .NF
귀하의 예가 진행되는 한 이것은 무해합니다, AFAICT. 그러나 기본값이 아닌 필드 구분 기호를 지정하면awk -F, '{for(x=1;$x;++x) print $x}'
이것은 귀하의 예와 동일한 작업을 수행하려고 시도하지만 줄을 쉼표로 구분합니다. 를 입력하면
a b
가 출력됩니다a b
. 를 입력하면a,b
별도의 줄에 및 가 인쇄됩니다a
.b
하지만 를 입력하면 null이기 때문에a,,b
출력a
한 다음 중지됩니다 .$2