awk 코드 블록이나 함수에서 NF로 무엇을 할 수 있나요?

awk 코드 블록이나 함수에서 NF로 무엇을 할 수 있나요?

인용하다:awk유틸리티용 POSIX 표준.

제가 정말로 그리워하는 것 중 하나 는 Perl의 명령 awk과 같은 구분 기호를 사용하여 배열을 연결하여 일반적으로 즉각적인 출력을 수행할 수 있다는 것입니다 .join

대신 다음과 같은 코드를 작성하게 됩니다.

for (key in array)
    joined_string = (joined_string ==  "" ? array[key] : joined_string "," array[key])

print joined_string

또는

joined_string = array[1]
for (i = 2; i <= length(array); ++i)
    joined_string = joined_string "," array[i];

print joined_string

그러나 awk현재 필드를 변경하면 다음과 같이 됩니다.

OFS="," # (would probably do this in BEGIN)

n = 0
for (key in array)
    $(++n) = array[key]

print

나는 이것이 완전히 합법적이라고 믿습니다. 그러나 현재 입력 레코드에 배열 array에 있는 항목보다 더 많은 필드가 있으면 출력에 쓰레기가 생성됩니다("가비지"는 입력 파일의 데이터가 됩니다). 그래서 이렇게 할 수 있으면 좋을 것 같아요

OFS = "," # (would probably do this in BEGIN)

n = 0
for (key in array)
    $(++n) = array[key]

NF = n
print

표준에서 NF수정이 허용된다는 텍스트를 찾을 수 없지만 수정이 허용되지 않거나 정의되지 않은 동작이 호출된다는 텍스트도 없습니다. 메시지 나할 수 있는것으로 밝혀졌다getline 세트NF. 그렇다고 내 자신의 함수나 재설정 코드 블록을 작성할 수 없다는 뜻은 아니지만 NF"함수"가 존재하는 경우에는 이렇게 하는 것이 좋습니다.getline

도 지적했다$0에 할당되도록 허용됨그리고 이것은 재설정됩니다 NF. 이는 아래 코드가 더 좋아진다는 뜻인가요?

OFS = "," # (would probably do this in BEGIN)

$0 = ""
n = 0
for (key in array)
    $(++n) = array[key]

print

이중 질문:

  1. 설정을 허용하시겠습니까 NF?
  2. 마지막 코드 조각이 배열을 출력 구분 기호와 연결하는 올바른 방법입니까?

답변1

내가 아는 한 그런 건 없다.기준설정의 부작용에 대한 텍스트 NF는 물론 설정 허용 여부도 기록합니다. Gawk 핸드북(다음으로도 출판됨)효과적인 awk프로그래밍), 이것은 의미합니다Awk를 전체적으로 기록하려고 시도합니다.그리고 GNU 구현뿐만 아니라다음을 포함합니다:

감소하면 NF새 값 NF과 다시 계산 후 필드 값이 삭제됩니다 $0. (DC)

경고와 함께

경고하다:일부 버전은 awk축소 시 다시 빌드되지 않습니다.$0NF

"(dc)" 언급은 이것이Awk의 'Dark Corners',문서화가 잘 안 되어 있거나 전혀 문서화되어 있지 않으며 구현마다 동작이 다를 수 있습니다.

POSIX는 특수 변수를 다음과 같이 정의합니다.

에 의해 설정된 변수

그러나 일반적으로 프로그램에서 설정할 수 있는지 여부는 지정하지 않습니다. 일부 변수에 대한 사양에서는 수정될 수 있다고 언급하고( 참조 ARGC) ARGV, 다른 변수에 대한 사양에서는 변경 결과가 구현에 따라 정의된다고 언급하며( ENVIRON), 다른 변수에서는 "분명히" 의도된 것 외에는 아무 것도 언급하지 않습니다. 프로그램에서 사용됩니다( OFS잠깐).

의 경우 NF실험을 통해 답의 일부가 제공됩니다.

  • NFGNU Awk에 문서화된 작업을 수정 하고 mawk동일한 방식으로 작동합니다.
  • NF로 변경진짜 어이없네유지되지만 $0다시 계산되지는 않습니다.

그래서 나는 말하고 싶다

  1. 설정은 허용되지만 NF, 값을 설정하는 것 외에는 부작용이 없을 수 있습니다.
  2. 설정 이후$0 POSIX에서 지정한 대로 마지막 변형은 사양에 따라 정확합니다. (이것이 사실인지 여부는 논쟁의 여지가 있습니다.이것졌기 때문에 올바른 방법이다 $0. )

이 기능은awk에서 배열을 문자열로 변환하는 방법은 무엇입니까?흥미롭지만 정의상 GNU Awk 확장에 의존하므로 이 질문에 대한 답은 아닙니다.

(다소 놀랍게도 TOTA를 포함하여 설정할 수 있는 다른 변수로는 NR및 가 있습니다 FNR. FILENAME그러나 설정할 수 없으며 오히려 설정하면 값이 지워집니다.)

관련 정보