求助:如何用awk实现两行合并与重复条目求和
解决方案
一步完成合并+去重求和的命令
用awk可以一次性完成两行合并、重复条目求和的操作,同时处理可能的格式异常:
zcat file.tar.gz | awk ' # 奇数行:保存条目名称,清理末尾多余空白/控制字符 NR%2 { key = $0; gsub(/[[:space:]]+$/, "", key); next } # 偶数行:将对应数值累加到条目总和中 { sum[key] += $0 } # 所有行处理完毕后输出结果 END { for (k in sum) { print k ": " sum[k] } }'
如果需要按条目名称排序输出,在命令末尾追加管道排序:
zcat file.tar.gz | awk ' NR%2 { key = $0; gsub(/[[:space:]]+$/, "", key); next } { sum[key] += $0 } END { for (k in sum) { print k ": " sum[k] } }' | sort
之前命令的问题分析
- 第一个命令错误:
awk 'NR%2{v=$0;next;}{print $0,v}'把**数值行(当前$0)**放在了前面,条目(v)在后面,输出顺序完全颠倒,正确写法应为print v ": " $0。 - 第二个命令出现错乱:大概率是条目行末尾存在多余的换行符(比如Windows格式的
\r)或空白字符,导致和数值拼接时出现异常。上面的解决方案用gsub(/[[:space:]]+$/, "", key)清理了这些干扰字符,可避免此类问题。
内容的提问来源于stack exchange,提问作者Prayag
相关产品推荐
相关产品推荐

