答え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
常に次のものが含まれていることがわかっているとします。二つ部分。