如何在Bash中使用AWK使用2个键提取值?

如何在Bash中使用AWK使用2个键提取值?,awk,Awk,我想使用Bash脚本来创建一个csv文件。 该脚本仅读取$1、$2和$4 我想用1美元,2美元作为钥匙 价值4美元,但如果有“关键”记录 然后将其打印为$1、$2,“关键”一行。 但不是使用“==”,“=~”对awk不起作用。 “包含”在此时无法正常工作 如果有人能帮我解决这个问题,我将不胜感激 ''' 输入 A, SVC-ID01, Critical A, SVC-ID01, Info A, SVC-ID01, Good A, SVC-ID01, Good A, SVC-ID01, Good

我想使用Bash脚本来创建一个csv文件。 该脚本仅读取$1、$2和$4

我想用1美元,2美元作为钥匙 价值4美元,但如果有“关键”记录 然后将其打印为$1、$2,“关键”一行。 但不是使用“==”,“=~”对awk不起作用。 “包含”在此时无法正常工作

如果有人能帮我解决这个问题,我将不胜感激

'''

输入

A, SVC-ID01, Critical A, SVC-ID01, Info A, SVC-ID01, Good A, SVC-ID01, Good A, SVC-ID01, Good A, SVC-ID02, Info A, SVC-ID02, Info A, SVC-ID02, Good B, SVC-ID-03, Good B, SVC-ID-03, Good B, SVC-ID-03, Good B, SVC-ID-04, Info B, SVC-ID-04, Info B, SVC-ID-04, Good B, SVC-ID-04, Info A, SVC-ID01, Critical A, SVC-ID02, Info B, SVC-ID-03, Good B, SVC-ID-04, Info 输出

A, SVC-ID01, Critical A, SVC-ID01, Info A, SVC-ID01, Good A, SVC-ID01, Good A, SVC-ID01, Good A, SVC-ID02, Info A, SVC-ID02, Info A, SVC-ID02, Good B, SVC-ID-03, Good B, SVC-ID-03, Good B, SVC-ID-03, Good B, SVC-ID-04, Info B, SVC-ID-04, Info B, SVC-ID-04, Good B, SVC-ID-04, Info A, SVC-ID01, Critical A, SVC-ID02, Info B, SVC-ID-03, Good B, SVC-ID-04, Info A、 SVC-ID01,临界 A、 SVC-ID02,信息 B、 SVC-ID-03,很好 B、 SVC-ID-04,信息
''

您没有4列,如果未设置
临界值
信息
,则为数组分配
$3
。字段分隔符看起来应该是
,“
,否则您需要在
“Critial”
“Info”
上进行匹配

例如:

awk -F ", " '{
    arr[$1", "$2];
    if ($3 == "Critical" || arr2[$1", "$2] == "Critical")
    {
        arr2[$1", "$2]="Critical"; 
    }
    else if (arr2[$1", "$2] != "Info")
    {
        arr2[$1", "$2]=$3;
    }
}
END {for (i in arr) {print i "" arr[i] ", " arr2[i]} }' ${filename} | sort $2

我将使用两个查找表将“Critical”设置为“max”值:

awk'
开始{
FS=子SP=OFS=“,”
状态[“良好”]=1;查找[1]=“良好”
状态[“信息”]=2;查找[2]=“信息”
状态[“关键”]=3;查找[3]=“关键”
}
值[$1,$2]<状态[$3]{value[$1,$2]=状态[$3]}
结束{
PROCINFO[“排序在”]=“@ind\u str\u asc”
对于(输入值)打印键,请查阅[值[键]]
}
"输入,
这个输出

A,SVC-ID01,严重
A、 SVC-ID02,信息
B、 SVC-ID-03,很好
B、 SVC-ID-04,信息
输出:

B, SVC-ID-03, Good
B, SVC-ID-04, Info
A, SVC-ID01, Critical
A, SVC-ID02, Info
输出看起来是随机的,您可以通过管道将输出传输到
排序
。如果数据像示例中那样预先排序,则可以使用以下命令并跳过
排序

$ awk '{
    if($1 OFS $2!=p && FNR>1) {
        print p,b
        b=""
    }
    if(b==""||$3=="Critical"||$3=="Info"&&b!="Critical"||b=="")
        b=$3
    p=$1 OFS $2
}
END {
    print $1,$2,b
}' file

@Sheller哦,是的,有一个打字错误,我只在一个地方写了。谢谢你的提醒<
bash
中的code>awk没有任何意义。Awk本身就是一个二进制文件,随着时间的推移,它已经通过了多个外壳,它的工作通常不依赖外壳的味道。@Inian NOOOO,我离golden bash徽章太近了!:D@JamesBrown当前位置我相信你会在本周内收到。有边框的没问题,但这与当前的shell无关all@Inian当然可以。让它更有价值。