리눅스 awk 프로그램 코드가 이해가 안갑니다.

익명 사용자의 이미지

BEGIN {
    FS="[^a-zA-Z]+"
}
{
    for (i=1; i<=NF; i++)
        words[tolower($i)]++
}
END {
    for (i in words)
        print i, words[i]
}

필드 구분자를 알파벳을 제외한다는 거 같은데 +가 붙은 이유와
첫 번째 for문에서 words[tolower($i)]++ 이 부분이 잘 이해가 가지 않습니다. tolower함수?가 전달받은 인수를 소문자로 하는 것은 알겠는데 words라는 배열이 선언 없이 쓰이는 것도 이상하고 []안에 스트링을 적고 1을 증가시킨다는 것이...이해가 안갑니다.
raymundo의 이미지

awk 의 필드구분자는 정규식을 쓸 수 있어서, +는 "한 번 이상 반복"을 의미합니다.

저 코드의 FS는 "영문자 알파벳을 제외한 문자가 한 번 이상 반복되는 형태의 문자열"을 의미하게 되지요.

스페이스, 탭 등의 공백 문자
12{}
1 + 3 = 4
등등...

awk에서는 배열을 쓰려고 미리 선언하지 않아도 됩니다.

awk의 배열은 연관배열(associative array)라서 인덱스가 숫자가 아니라 문자열입니다.

결과적으로 저 코드는 어떤 영단어가 몇 번 등장하는지 카운트를 하겠네요.

좋은 하루 되세요!