awk 배열을 인쇄하고 특수 문자를 쉼표로 바꿉니다.

awk 배열을 인쇄하고 특수 문자를 쉼표로 바꿉니다.

제목이 이것을 올바르게 설명하기를 바랍니다. 현재 스프레드시트에서 고유한 값을 계산한 후 배열을 인쇄하려고 합니다.

내 awk 명령이 잘 작동합니다.

awk -F"," 'NR>1{col[$1,$9]++} END {for (i in col) printf("%s: %d\n", i, col[i])}' my_file.csv | sort

인쇄할 때 물음표처럼 보이는 특수 문자가 나타납니다.

산출

연도와 계절 사이에 쉼표 + 공백을 사용하여 이를 인쇄하려면 어떻게 해야 합니까?

예: 1896, 여름: 151

답변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파일 구분 기호", 일반적으로 사용됨). 이는 표준에 awk1차원 배열만 있기 때문입니다. 다차원 배열은 인덱스를 연결하고 이 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항상 다음이 포함되어 있다는 것을 알고 있다고 가정합니다.부분.

관련 정보