AWK技术问题:如何找出同名但Severity变更的行并输出变更详情
问题分析与解决
输入文件内容
两个文件test1和test2的内容如下:
$ cat test* alert_name,id,severity bar,2,1 foo,1,0 alert_name,id,severity foo,1,9 bar,2,1
需求
找出alert_name相同但severity发生变化的条目(比如示例中的foo),并打印具体的变更情况。
原错误代码及输出
原AWK代码
awk 'BEGIN{FS=","} FNR>1 && NR==FNR { a[$1]; next } ($1 in a) && ($3 != a[$3]) {printf "Alert %s severity from %s to %s\n", $1, a[$3], $3}' test1 test2
错误输出
Alert foo severity from to 9 Alert bar severity from to 1
错误原因分析
- 数组存储逻辑错误:原代码仅将
alert_name作为数组键存入a[$1],但没有关联存储对应的severity值,导致后续无法调用原文件的severity数据。 - 条件判断错误:原代码中
$3 != a[$3]的逻辑完全偏差,正确的判断应该是对比当前文件的severity($3)与原文件中对应alert_name的severity(a[$1])。
修正后的代码
awk 'BEGIN{FS=","} FNR>1 && NR==FNR { a[$1] = $3; next } FNR>1 && ($1 in a) && ($3 != a[$1]) { printf "Alert %s severity from %s to %s\n", $1, a[$1], $3 }' test1 test2
正确输出结果
Alert foo severity from 0 to 9
代码解释
BEGIN{FS=","}:设置字段分隔符为逗号,适配CSV格式的文件内容。FNR>1 && NR==FNR:处理第一个文件(test1)时,跳过表头行,将每个alert_name对应的severity存入数组a,键为alert_name,值为对应severity。FNR>1 && ($1 in a) && ($3 != a[$1]):处理第二个文件(test2)时,跳过表头行,检查当前alert_name是否存在于数组中,且当前severity与数组中存储的原值不同,满足条件则打印变更信息。
内容的提问来源于stack exchange,提问作者Josh Friedlander
相关产品推荐
相关产品推荐

