연관 배열은 어떻게 작동하나요?

연관 배열은 어떻게 작동하나요?
bash-3.00# cat iplogs.txt
180607 093423   123.12.23.122  133
180607 121234   125.25.45.221  153
190607 084849   202.178.23.4   44
190607 084859   164.78.22.64   12
200607 012312   202.188.3.2    13
210607 084849   202.178.23.4   34
210607 121435   202.178.23.4   32
210607 132423   202.188.3.2    167

bash-3.00# awk '{ip[$3]++;} END{for (var in ip)\
print var, "access", ip[var]," times"}' iplogs.txt
202.188.3.2 access 2  times
164.78.22.64 access 1  times
202.178.23.4 access 3  times
125.25.45.221 access 1  times
123.12.23.122 access 1  time

위의 출력을 이해하지 못합니다. 반복되는 각 값을 증가시키는 방법은 무엇입니까 $3?

배열에 할당된 값은 다음 ip과 유사할 것으로 예상했습니다.

ip[123.12.23.122]=0
ip[125.25.45.221]=1

등.

그래서 이렇게 해봤는데 배열의 값이 ip[var]출력되지 않네요.

bash-3.00# awk '{ip[$3]++;} END{for (var=0;var <= NR; var++)\
print var, ip[var]}' iplogs.txt
0
1
2
3
4
5
6
7
8

답변1

연관 배열은 정수 인덱스가 아닌 문자열을 키로 사용합니다. * 이 경우 키는 이며 $3, 이는 awk세 번째(3rd) 필드에 해당하는 필드변수입니다. 입력 예에서는 IPv4 주소처럼 보이는 문자열이 포함된 세 번째 열이 됩니다. 표현식에서 ip[$3]++이면 증가 $3합니다 . 샘플 입력에서는 총 2배 이므로 2 배로 증가하게 됩니다. 초기화되지 않은 모든 awk 변수와 마찬가지로 처음부터 시작하므로 최종 값은 입니다 ."202.188.3.2"ip["202.188.3.2"]$3"202.188.3.2"ip["202.188.3.2"]02

첫 번째 예제에서는 를 사용합니다 for (var in ip). 이는 알 수 없는 키가 있는 배열을 반복하는 올바른 방법입니다. 두 번째 예 에서는 for (var = 0; var <= NR; var++).ipIPv4 주소처럼 보이는 문자열,아니요정수 인덱스. ip[0], , ... 요소 는 할당되지 않았기 때문에 존재하지 않습니다( , , ... ip[1]이 할당되지 않았기 때문에 ). 따라서 빈 출력( )이 표시됩니다.$3012""


* 에서는 awk정수 배열 인덱스가 실제로 먼저 문자열로 변환되므로 a[1]a["1"]는 동일한 요소입니다.

관련 정보