AWK字典无法跨行记录词频,值始终为0的问题排查
AWK去重脚本问题排查
你的脚本核心问题是数组引用错误:AWK中访问数组元素不需要加$符号,$是用来引用行内字段(比如$1代表第一个字段)的语法,而你写的$seen[a[1]]本质是在操作字段,而非数组seen的元素。
错误原因解析
- 当你使用
$seen[a[1]]时,AWK会先计算seen[a[1]]的值(初始为0),然后取第0个字段(实际等同于$0,整行内容),自增操作$seen[a[1]]++只是修改了字段值,并没有改变数组seen里的元素。 - 这就导致每次判断时,
seen[a[1]]始终保持默认的0值,脚本会重复打印同一个单词。
修正后的脚本
把数组引用的$去掉即可:
match($0, /^(\w+)$/, a) { if (!seen[a[1]]++) print a[1], "new word" }
修正后逻辑
- AWK中未赋值的数组元素默认值为0,第一次遇到单词时,
!seen[a[1]]为!0(即真),执行打印,随后seen[a[1]]自增为1。 - 后续再遇到相同单词时,
seen[a[1]]的值为1,!1为假,不再执行打印,实现仅首次出现时打印的去重效果。
内容的提问来源于stack exchange,提问作者Alexis Purslane
相关产品推荐
相关产品推荐

