#!/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]
print
8
arr[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
}