You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 06:44:57