awk의 문 사이의 구분 기호

awk의 문 사이의 구분 기호

Gawk 매뉴얼에서:

규칙의 awk 문이 짧은 경우 한 줄에 여러 문을 입력해야 할 수도 있습니다. 이는 세미콜론(';')으로 명령문을 구분하여 수행됩니다. 이는 규칙 자체에도 적용됩니다. 따라서 이 섹션의 시작 부분에 표시된 프로그램은 다음과 같이 작성할 수도 있습니다.

/12/ { print $0 } ; /21/ { print $0 }

참고: 원래 awk 언어에는 같은 줄의 규칙을 세미콜론으로 구분해야 한다는 요구 사항이 없습니다. 이는 액션의 명령문 처리와 일관성을 유지하기 위해 추가되었습니다.

하지만 난 절대https://stackoverflow.com/q/20262869/156458

awk '$2=="no"{$3="N/A"}1' file

$2=="no"{$3="N/A"}그리고 두 개의 진술이 아닌가요 1? 왜 그들은 아무것도 분리되지 않습니까?

감사해요.

답변1

아주 좋은 질문입니다! 제가 생각하는 핵심은 다음과 같습니다."따라서 이 섹션의 시작 부분에 표시된 절차는다음과 같이 쓸 수도 있습니다.이 방법:"

이런 식으로 작성하는 것이 필수는 아닙니다. 이것은 대체 방법입니다. 이는 다음 진술이 모두 사실임을 의미합니다(실제로 입증되었습니다).

$ awk '/12/ { print $0 } /21/ { print $0 }' file
$ awk '/12/ { print $0 } ; /21/ { print $0 }' file

세미콜론을 사용하는 것은 작업 부분을 생략하고 같은 줄에 여러 규칙을 적용하려는 경우와 같이 매우 짧은 관용적 코드를 다루기 위한 것이라고 생각합니다.

$ awk '/12//21/' file
awk: cmd. line:2: /12//21/
awk: cmd. line:2:         ^ unexpected newline or end of string

이 경우 세미콜론을 사용하여 규칙(=조건)을 구분해야 합니다.

$ awk '/12/;/21/' file

두 규칙/두 조건 모두에서 이 {action}부분이 생략되므로 각 규칙에 대해 기본 작업이 수행됩니다.{print $0}

답변2

gawk에서 이 두 참조는매뉴얼에서문제를 설명하세요.

작업은 중괄호('{…}')로 묶인 하나 이상의 awk 문으로 구성됩니다. 각 명령문은 수행할 작업을 하나씩 지정합니다. 명령문은 개행 또는 세미콜론으로 구분됩니다.

세미콜론은 "분할기"하지만"터미네이터".
작업에 유효한 유일한 종결자는 닫는 중괄호( })입니다.

따라서 작업 닫는 중괄호( ) }뒤에는 다른 내용이 와야 합니다.모드{액션}

"남자"에서"awk가 수행해야 하는 작업을 명확히 하는 데 도움이 될 수 있는 몇 가지 다른 설명이 있습니다.

명령문은 개행 문자, 세미콜론 또는 둘 다로 종료됩니다. 명령문 그룹(예: 작업 또는 루프 본문)은 C에서와 마찬가지로 { ... }로 차단됩니다. 블록의 마지막 문에는 종결자가 필요하지 않습니다.

남성노크"이렇게 설명했습니다.

먼저 패턴을 정하고 그다음에 행동을 취하세요. 연산문은 {와 }로 묶입니다.

그리고, 자세한 내용을 알고 싶으시다면,POSIX 설명 읽기:

action           : '{' newline_opt                             '}'
                 | '{' newline_opt terminated_statement_list   '}'
                 | '{' newline_opt unterminated_statement_list '}'
                 ;

"종료되지 않은" 진술 목록이 무엇인지 검색하십시오.

또는 더 쉽게 검색해보세요.행동읽다:

모든 단일 문은 중괄호로 묶인 문 목록으로 대체될 수 있습니다. 애플리케이션은 명령문 목록의 명령문이 <newline> 또는 <semicolon> 문자로 구분되어 있는지 확인해야 합니다.

다시:are separated by <newline> or <semicolon> characters

답변3

조건부 블록 사이의 세미콜론은 선택사항인 것으로 보입니다. 명령문 사이에는 세미콜론만 있습니다.이내에블록은 필수인 것 같습니다.

$ echo -e "foo\nbar" | gawk '/foo/ { print "foo found" } /bar/ {print "bar found"}'
foo found
bar found
$ echo -e "foo\nbar" | gawk '/foo/ { print "foo found" }; /bar/ {print "bar found"}'
foo found
bar found
$ echo -e "foo\nbar" | gawk '/foo/ { print "foo found"; print "whee" }'
foo found
whee
$ echo -e "foo\nbar" | gawk '/foo/ { print "foo found" print "whee" }'
gawk: cmd. line:1: /foo/ { print "foo found" print "whee" }
gawk: cmd. line:1:                           ^ syntax error

그러나 두 조건 사이의 실제 코드 블록이 기본값을 위해 생략된 경우 {print}세미콜론이 필요합니다 (예:

$ echo -e "foo\nbar" | gawk '/foo/ /bar/'
gawk: cmd. line:2: /foo/ /bar/
gawk: cmd. line:2:            ^ unexpected newline or end of string
$ echo -e "foo\nbar" | gawk '/foo/; /bar/'
foo
bar

관련 정보