awk에서 배열 삭제

awk에서 배열 삭제

awk에서는 루프를 사용하여 배열을 지워서 빈 배열이 되도록 할 수 있습니다. 이는 배열을 삭제하는 것과 동일합니다.

for (key in array) delete array[key];

더 쉬운 방법이 있나요? 변수 이름을 스칼라로 재사용할 수 있도록 배열을 완전히 삭제할 수 있습니까?

답변1

문법

delete array

현재 버전의 POSIX에서는 지원되지 않지만 거의 모든 기존 구현(원본 awk, GNU, mawk 및 BusyBox 포함)에서는 이를 지원합니다. POSIX의 향후 버전에 추가될 예정입니다.결함 0000544).

모든 배열 요소를 지우는 대체 방법은 split기존 요소를 모두 삭제하는 것입니다. 이는 이식 가능하고 표준을 준수하며 명령문이 아닌 표현식입니다.

split("", array)

를 포함한 이들 모두는 delete array원본 awk, GNU awk 및 mawk에서 변수를 배열 변수로 표시합니다(BusyBox awk에서는 제외). 제가 아는 한, 변수가 배열로 사용되면 스칼라 변수로 사용할 수 없습니다.

답변2

이것이 왜 좋은 생각인지는 모르겠지만 배열과 스칼라와 동일한 이름을 사용하고 동일한 범위에서 사용하지 않는 경우 다음과 같이 할 수 있습니다.

$ cat tst.awk
BEGIN {
    fooIsArray()
    foo = 17
    print "foo is a scalar:", foo
}

function fooIsArray(    foo) {
    foo[1] = "bar"
    print "foo is an array:", foo[1]
}

$ awk -f tst.awk
foo is an array: bar
foo is a scalar: 17

위에서는 foo[]함수의 사용되지 않는 매개 변수로 선언하여 함수 로컬 변수를 만들었습니다 fooIsArray(). 따라서 스크립트의 다른 곳에서 사용되는 전역 스칼라 변수와 아무 관련이 없으며 foo배열의 내용은 foo[]함수에서 반환될 때 삭제됩니다. fooIsArray().

관련 정보