打印 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

如果您想要一个由字符串的文字值索引的一维数组,您可以使用[$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始终包含部分。

相关内容