[unix] 커맨드 라인을 통해 awk vars를 설정하는 두 가지 방법이 있습니까?

프로그램 텍스트 다음awk명령 줄에서 awk 변수를 설정 하여 O’Reilly 예제 (1997)를 발견했습니다 . 작동하지만 man / info awk 에서이 구문을 찾을 수 없습니다 . 방금 놓쳤습니까? 사용되지 않습니까 …? 매뉴얼에서 본 유일한 구문은 옵션입니다.-v

awk '/home/{print foo, bar}' foo="cat" bar="dog" /proc/$$/cmdline

산출: cat dog



답변

실제로 POSIX에 있습니다 awk(POSIX 2008 링크, 이전 버전에서도 가능했습니다). 옵션 섹션에 -v설명되어 있고 다른 방법은 피연산자 섹션에 있습니다.

-v마지막에 파일 이름으로 과제를 전달하는 것과 전달하는 것에 는 차이가 있습니다.

  • -v:

응용 프로그램은 대입 인수가 대입 피연산자와 동일한 형식인지 확인해야합니다. 지정된 변수 할당 은 BEGIN 패턴과 관련된 동작을 포함하여 awk 프로그램을 실행하기 전에 발생해야합니다 (있는 경우). 이 옵션을 여러 번 지정할 수 있습니다.

  • 파일 이름과 혼합 :

[…] 이러한 각 변수 할당 은 다음 파일을 처리하기 직전에 발생해야합니다 ( 있는 경우). 따라서 첫 번째 파일 인수 이전의 할당은 BEGIN 작업 (있는 경우) 후에 실행되고 마지막 파일 인수 이후의 할당은 END 작업 (있는 경우) 전에 발생합니다. 파일 인수가 없으면 표준 입력을 처리하기 전에 할당을 실행해야합니다.

예:

$ cat input
hello
hello
$ awk -v var=one 'BEGIN{print var} /hello/{print var} END{print var}' \
    var=two input var=three input var=four
one
two
two
three
three
four


답변

이것은 외부에서 변수를 설정하는 오래된 스타일입니다 awk. 파일 이름이이면 어떻게되는지 모호 foo=cat하므로 이후 버전에서는 -v옵션이 추가되었습니다 . 이전 버전과의 호환성을 위해 작동해야하지만 보장 할 수는 없습니다. 그리고 내가 말했듯이, -v옵션은 최신 버전이므로 모든 버전 awk이 지원 하지는 않습니다 .


답변