Awk关联数组遍历语法错误排查:统计CSV作者书籍数量
解决Awk关联数组遍历的语法错误
你遇到的语法错误核心原因是:Mac默认搭载的是BSD Awk,它不支持GNU Awk(gawk)特有的for (key, value) in array同时获取键值的遍历语法,且PROCINFO["sorted_in_place"]也是GNU Awk独有的配置项。下面给出两种适配场景的修正方案:
方案一:使用Mac默认BSD Awk(无需额外安装)
BSD Awk遍历关联数组只能先获取键,再通过键调取对应值,修正后的脚本如下:
#!/bin/zsh awk -v FS="," 'NR > 1 { author_id = $2; count[$author_id]++; } END { for (author_id in count) { printf "%s, %d\n", author_id, count[author_id]; } }' "~/list_of_books_per_author.csv" | sort -nrk2,2 | head -n 10
关键调整说明:
- 移除无效的
PROCINFO["sorted_in_place"](BSD Awk不支持该配置),保留原脚本末尾的sort -nrk2,2实现按书籍数量降序排序,逻辑与需求一致。 - 遍历数组时采用
for (author_id in count)获取每个键,再通过count[author_id]拿到对应计数。 - 将作者ID的格式化符从
%d改为%s,避免ID为字符串格式时出现格式化错误。
方案二:安装并使用GNU Awk(gawk)
如果想使用GNU Awk的便捷语法,可先通过Homebrew安装:
brew install gawk
修改为GNU Awk兼容版本,同时修正原脚本的语法细节(多余分号、变量名冲突):
#!/bin/zsh gawk -v FS="," 'NR > 1 { author_id = $2; count[$author_id]++; } END { PROCINFO["sorted_in_place"] = "@val_num_desc"; # 按数值降序排序,替代外部sort命令 for (author_id, cnt) in count { printf "%s, %d\n", author_id, cnt; } }' "~/list_of_books_per_author.csv" | head -n 10
关键调整说明:
- 使用
PROCINFO["sorted_in_place"] = "@val_num_desc"直接在Awk内部按书籍数量降序排序,省去外部sort命令,提升大文件处理效率。 - 修正遍历语法:原脚本中用
count作为值变量(与数组名冲突),改为cnt避免歧义,正确写法为for (author_id, cnt) in count。
内容的提问来源于stack exchange,提问作者user3049941
相关产品推荐
相关产品推荐

