awk '{for(x=1;$x;++x)print $x}' 명령을 이해하는 방법은 무엇입니까?

awk '{for(x=1;$x;++x)print $x}' 명령을 이해하는 방법은 무엇입니까?

나는 이 명령을 안다

awk '{for(x=1;$x;++x)print $x}' 

행의 모든 ​​열을 인쇄합니다.

이것이 2로 ++x 변경되어 먼저 인쇄 되지 않습니까 ? 제가 이해한 바에 따르면 다음과 같습니다.x$2https://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

  1. ++xx++개별적으로 사용하면 기능적으로 동일합니다. 귀하가 인용한 스택 오버플로 질문에서 논의한 바와 같이,

    • 이있을 수 있습니다성능(즉, 시간) 차이.
    • something = ++x; 의 결과 something = x++;는 다르지만 귀하의 예는 그렇지 않습니다.

    따라서 증가 측면에서 x귀하의 예는 다음과 같습니다.

    awk '{for(x=1;$x;엑스++) $x}'를 인쇄하세요
    
  2. 독립 실행형 $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

관련 정보