答案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
如果您想要一个由字符串的文字值索引的一维数组,您可以使用[$1 "," $9]
或更一般的方法[$1 FS $9]
(后者确保该解决方案适用于具有其他分隔符的数据):
$ echo 'A,A' | gawk -F, '{col[$1 FS $2]++} END{for(i in col) print i}'
A,A
如果您想要逗号+空格,请使用或在块中[$1 FS" " $2]
设置。SUBSEP = FS" "
BEGIN
答案2
$1,$9
当您使用像in 中的数组这样的索引时awk
,实际使用的索引是$1 SUBSEP $9
,其中SUBSEP
是一个不太可能出现在实际数据中的字符(实际值是实现定义的,但八进制 34,一个称为“的字符”文件分隔符",常用)。这是因为标准awk
只有一维数组。多维数组是通过连接索引并以此SUBSEP
值作为分隔符来“模拟”的。
GNUawk
有真正的多维数组,但语法[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
始终包含二部分。