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

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

错误原因分析

  1. 数组存储逻辑错误:原代码仅将alert_name作为数组键存入a[$1],但没有关联存储对应的severity值,导致后续无法调用原文件的severity数据。
  2. 条件判断错误:原代码中$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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 11:10:10