문자열을 통해 배열 요소를 참조하고 awk에서 배열을 초기화합니다.

문자열을 통해 배열 요소를 참조하고 awk에서 배열을 초기화합니다.
#!/usr/bin/env bash
awk '
  BEGIN {
    arr[A]=1;
    arr[B]=1;
    arr[C]=1;
    arr[E]=1;
    arr[J]=8;
    arr[Q]=10;
    print arr[J]
  }'

위 명령에 의해 출력되는 최신 설정 값은 arr['subscript']이 경우 값 이 아닌 이전 값 10입니다 .arr[Q]print8arr[J]

arr['A'], arr['B'], arr['C'] and arr['E']또한, 위의 스크립트처럼 같은 값을 갖는 값에 한 줄씩 값을 할당 하는 것이 아니라 1, 대신 첨자 집합을 인수 중 하나로 전달하고 공통 값을 다른 값으로 전달하고 싶습니다. 함수를 처리하는 함수에 대한 인수는 값을 할당하는 논리입니다.

답변1

배열 인덱스는 정수이거나 인용된 문자열일 수 있습니다 awk. 여기서 하고 있는 일은 아직 초기화되지 않은 변수를 사용하는 것입니다. 따라서 해당 값은 비어 있습니다.

각 할당이 이전 값을 덮어쓰므로 배열에 할당된 최신 값을 얻게 됩니다. 사용하면 print arr[""]보상도 받을 수 있습니다 10.

대신에 arr["A"]=1.

이전 질문에 대해: 명령줄에서 배열을 초기화하는 실제 도구는 없지만 awk블록 BEGIN(예: 블록)에서 "디코딩"할 수 있는 "인코딩된" 값을 전달하여 키와 값을 추출할 수 있습니다. 배열.

특수하게 구분된 목록을 단일 문자열로 전달하고 이를 구문 분석하여 사용할 인덱스와 값을 추출하는 예:

awk -v vals="A=1:B=1:C=1:E=1:J=8:Q=10" '
    BEGIN {
        n = split(vals, v, ":")
        for (i = 1; i <= n; ++i) {
            split(v[i], a, "=")
            arr[a[1]] = a[2]
        }

        print arr["J"]
    }'

별도의 키와 값을 사용하세요.

awk -v keys="A:B:C:E:J:Q" -v vals="1:1:1:1:8:10" '
    BEGIN {
        nk = split(keys, k, ":")
        nv = split(vals, v, ":")

        if (nk != nv) exit 1

        for (i = 1; i <= nk; ++i)
            arr[k[i]] = v[i]

        print arr["J"]
    }'

이는 "배열"을 에 전달하는 상당히 제한된 방법이지만 awk사용자가 완전히 제어할 수 있는 간단한 값에 대해 작동합니다. 이러한 예는 실제 데이터에 콜론(및 첫 번째 예의 등호)이 포함된 모든 데이터에 대해 중단됩니다.

이와 같이 데이터를 전달한다는 것은 데이터의 백슬래시가 특별히 처리되어야 함을 의미합니다( \n개행 문자이므로 두 개의 문자열을 전달하려면 or 를 \n사용해야 함 )."\\\n"'\\n'

관련 정보:


그런데, 다음과 같이 "순수한 스크립트"를 작성할 수 있습니다 awk.

#!/usr/bin/awk -f

BEGIN { 
   # some initialisations
}

some_expression { some code }

END {
    # more here
}

관련 정보