명령줄에 awk 배열을 설정하시겠습니까?

명령줄에 awk 배열을 설정하시겠습니까?

-v이 스위치를 명령줄에서 사용하여 awk변수 값을 설정할 수 있다는 것을 알고 있습니다 .

awk명령줄에서 연관 배열 요소의 값을 설정하는 방법이 있습니까?

그것은 다음과 같습니다:

awk -v myarray[index]=value -v myarray["index two"]="value two" 'BEGIN {...}'

답변1

캔트. 명령줄에서 이와 같은 스칼라가 아닌 변수를 할당하는 것은 불가능합니다. 하지만 만드는 것은 그리 어렵지 않습니다.

고정된 배열 이름을 사용할 수 있는 경우:

awk -F= '
  FNR==NR { a[$1]=$2; next}
  { print a[$1] }
' <(echo $'index=value\nindex two=value two') <(echo index two)

배열 정의에 대한 awk 구문이 포함된 파일이 있는 경우 다음을 수행할 수 있습니다 include.

$ cat <<EOF >file.awk
ar["index"] = "value"
ar["index two"] = "value two"
EOF

$ gawk '@include "file.awk"; BEGIN{for (i in ar)print i, ar[i]}'

또는

$ gawk --include file.awk 'BEGIN{for (i in ar)print i, ar[i]}'

정말로 원한다면 run 대신 gawk사용할 수 있습니다 . 그러면 해석되지 않은 명령줄이 제공됩니다. 그런 다음 이러한 명령줄 옵션을 처리할 수 있습니다(변수 할당처럼 보이면 변수를 할당하세요). 해당 경로를 가고 싶다면 다음을 살펴보는 것이 도움이 될 수 있습니다.-E-fngetopt.awk.

답변2

POSIX에서는 awk그렇게 할 수 없습니다.

이것공식적으로 -v assignment는 다음과 같이 정의됩니다.

이식 가능한 문자 집합의 또는 알파벳 문자(XBD 이식 가능한 문자 집합의 표 참조)로 시작하여 이식 가능한 문자 집합의 일련의 밑줄, 숫자 및 문자, 마지막으로 "=" 문자, 변수 할당이 옵니다. 경로 이름 대신 지정해야 합니다. "=" 앞의 문자는 awk 변수의 이름을 나타냅니다. 이름이 awk 예약어(구문 참조)인 경우 동작은 정의되지 않습니다.

awk변수 만 허용합니다.이름.

awk배열 요소를 설정하는 경우 :

myarray[index]=value

myarray[index]lvalue, 불변이름. 그러니 불법입니다.

모든 변수와 필드를 설정할 수 있습니다.

lvalue = expression

그리고lvalue변수, 인덱스 배열 또는 필드 선택기가 될 수 있습니다.

답변3

이건 어때?

awk _F";" -v M=JanFebMarAprMayJunJulAugSepOctNovDec '$1>=180525 && $1<=180630\
{ m=substr($1,3,2); m=(m-1)*3+1; printf(" %s %d, 20%d\t%s\n",substr(M,m,3),\
substr($1,5,2),substr($1,1,2),$0);}' Filename

파일은 ";"으로 구분됩니다. 첫 번째 필드의 날짜 형식은 yymmdd입니다. 문자열을 배열로 사용합니다. 이게 부정행위인가요?

관련 정보