답변1
awk는 [$1,$9]
이를 의사 다차원 배열로 처리하고 내부 SUBSEP
문자를 삽입합니다. 이 내용은 다음과 같이 기록됩니다.GNU Awk 사용자 가이드예를 들어:
하위 집합
아래 첨자 구분 기호입니다. 기본값은 "\034"이며 다차원 배열의 인덱스 부분을 구분하는 데 사용됩니다. 따라서 'foo["A", "B"]' 표현식은 실제로 foo["A\034B"]에 액세스합니다(다차원 배열 섹션 참조).
전임자.
$ echo 'A,A' | gawk -F, '{col[$1,$2]++} END{for(i in col) print i}' | od -to1
0000000 101 034 101 012
0000004
문자열의 리터럴 값으로 인덱싱된 1D 배열을 원하는 경우 [$1 "," $9]
또는 보다 일반적인 접근 방식을 사용할 수 있습니다 [$1 FS $9]
(후자는 다른 구분 기호가 있는 데이터에 대해 솔루션이 작동하도록 보장합니다).
$ echo 'A,A' | gawk -F, '{col[$1 FS $2]++} END{for(i in col) print i}'
A,A
쉼표 + 공백을 원할 경우 block 을 사용하거나 설정하세요 [$1 FS" " $2]
.SUBSEP = FS" "
BEGIN
답변2
$1,$9
배열에서와 같은 인덱스를 사용할 때 awk
사용되는 실제 인덱스는 실제 데이터에 나타날 가능성이 없는 문자가 있는 $1 SUBSEP $9
위치 입니다(실제 값은 구현에 따라 정의되지만 8진수 34, " "라는 문자).SUBSEP
파일 구분 기호", 일반적으로 사용됨). 이는 표준에 awk
1차원 배열만 있기 때문입니다. 다차원 배열은 인덱스를 연결하고 이 SUBSEP
값을 구분 기호로 사용하여 "시뮬레이트"됩니다.
GNU에는 awk
실제 다차원 배열이 있지만 구문은 [i][j]
그렇지 않습니다 [i,j]
.
이 값에 대해 인덱스를 분할하면 인덱스의 원시 비트가 반환될 수 있습니다 SUBSEP
.
for (i in col) {
split(i, k, SUBSEP)
year = k[1]
season = k[2]
printf "%s, %s: %s\n", year, season, col[i]
}
그렇지 않으면
for (i in col) {
split(i, k, SUBSEP)
printf "%s, %s: %s\n", k[1], k[2], col[i]
}
위의 두 조각 모두 색인에 i
항상 다음이 포함되어 있다는 것을 알고 있다고 가정합니다.둘부분.