인용하다: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
이중 질문:
- 설정을 허용하시겠습니까
NF
? - 마지막 코드 조각이 배열을 출력 구분 기호와 연결하는 올바른 방법입니까?
답변1
내가 아는 한 그런 건 없다.기준설정의 부작용에 대한 텍스트 NF
는 물론 설정 허용 여부도 기록합니다. Gawk 핸드북(다음으로도 출판됨)효과적인 awk
프로그래밍), 이것은 의미합니다Awk를 전체적으로 기록하려고 시도합니다.그리고 GNU 구현뿐만 아니라다음을 포함합니다:
감소하면
NF
새 값NF
과 다시 계산 후 필드 값이 삭제됩니다$0
. (DC)
경고와 함께
경고하다:일부 버전은
awk
축소 시 다시 빌드되지 않습니다.$0
NF
"(dc)" 언급은 이것이Awk의 'Dark Corners',즉문서화가 잘 안 되어 있거나 전혀 문서화되어 있지 않으며 구현마다 동작이 다를 수 있습니다.
POSIX는 특수 변수를 다음과 같이 정의합니다.
에 의해 설정된 변수앗
그러나 일반적으로 프로그램에서 설정할 수 있는지 여부는 지정하지 않습니다. 일부 변수에 대한 사양에서는 수정될 수 있다고 언급하고( 참조 ARGC
) ARGV
, 다른 변수에 대한 사양에서는 변경 결과가 구현에 따라 정의된다고 언급하며( ENVIRON
), 다른 변수에서는 "분명히" 의도된 것 외에는 아무 것도 언급하지 않습니다. 프로그램에서 사용됩니다( OFS
잠깐).
의 경우 NF
실험을 통해 답의 일부가 제공됩니다.
NF
GNU Awk에 문서화된 작업을 수정 하고mawk
동일한 방식으로 작동합니다.NF
로 변경진짜 어이없네유지되지만$0
다시 계산되지는 않습니다.
그래서 나는 말하고 싶다
- 설정은 허용되지만
NF
, 값을 설정하는 것 외에는 부작용이 없을 수 있습니다. - 설정 이후
$0
예POSIX에서 지정한 대로 마지막 변형은 사양에 따라 정확합니다. (이것이 사실인지 여부는 논쟁의 여지가 있습니다.이것졌기 때문에 올바른 방법이다$0
. )
이 기능은awk에서 배열을 문자열로 변환하는 방법은 무엇입니까?흥미롭지만 정의상 GNU Awk 확장에 의존하므로 이 질문에 대한 답은 아닙니다.
(다소 놀랍게도 TOTA를 포함하여 설정할 수 있는 다른 변수로는 NR
및 가 있습니다 FNR
. FILENAME
그러나 설정할 수 없으며 오히려 설정하면 값이 지워집니다.)