Как я могу использовать извлекаемые значения, используя 2 ключа, используя AWK в Bash?

#awk

#awk

Вопрос:

Я хочу использовать скрипт Bash для подведения итогов чтения CSV-файла. Скрипт считывает только $ 1, $ 2 и $ 4.

Я хочу использовать $ 1, $ 2 в качестве ключа и $ 4 для значения, но если есть записи для «критических», то выведите их как $ 1, $ 2, «критические» в строке.но вместо использования «==», «=~» не работает с awk. и «содержит» в это время не работает должным образом.

Если кто-нибудь поможет мне решить эту проблему, это будет действительно оценено.

»’

Ввод

A, SVC-ID01, критический
A, SVC-ID01, Info
A, SVC-ID01, хорошо
A, SVC-ID01, хорошо
A, SVC-ID01, хорошо
A, SVC-ID02, Info
A, SVC-ID02, Info
A, SVC-ID02, хорошо
B, SVC-ID-03, хорошо
B, SVC-ID-03, хорошо
B, SVC-ID-03, хорошо
B, SVC-ID-04, Info
B, SVC-ID-04, Info
B, SVC-ID-04, хорошо
B, SVC-ID-04, Info
 awk -F "," '{ 
if (NR != 1) 

arr[$1","$2];
arr2[$1","$2]=$4;

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

вывод

A, SVC-ID01, критический
A, SVC-ID02, Info
B, SVC-ID-03, хорошо
B, SVC-ID-04, Info

»’

Комментарии:

1. awk в bash этом нет никакого смысла. Awk сам по себе является двоичным файлом и со временем прошел через несколько оболочек, и, как правило, его работа не зависит от типа оболочки.

2. @Inian НЕЕЕТ, я был так близок к значку golden bash! : D

3. @JamesBrown: Уверен, вы получите его в течение этой недели. Пограничные в порядке, но это вообще не имеет отношения к оболочке

4. @Inian Уверенный человек. Делает его более достойным.

Ответ №1:

Я бы использовал пару таблиц поиска, чтобы сделать «Критическим» значение «max»:

 awk '
    BEGIN {
        FS = SUBSEP = OFS = ", "
        state["Good"] = 1;     lookup[1] = "Good"
        state["Info"] = 2;     lookup[2] = "Info"
        state["Critical"] = 3; lookup[3] = "Critical"
    }
    value[$1, $2] < state[$3] {value[$1, $2] = state[$3]}
    END {
        PROCINFO["sorted_in"] = "@ind_str_asc"
        for (key in value) print key, lookup[value[key]]
    }
' Input
 

Это выводит

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

Ответ №2:

У вас нет 4 столбцов, и если нет Critical или Info уже установлено, присвоите $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
 

Ответ №3:

 $ awk '
$3=="Critical" || $3=="Info" amp;amp; a[$1 OFS $2]!="Critical" || a[$1 OFS $2]=="" {
    a[$1 OFS $2]=$3
}
END {
    for(i in a)
        print i,a[i]
}' file
 

Вывод:

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

Вывод отображается случайным образом, вы можете управлять этим, передавая вывод в . sort Если данные предварительно отсортированы, как в примере, вы можете использовать следующее и пропустить sort :

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

Комментарии:

1. @shellter Ах да, была опечатка, которую я, по-видимому, исправил только в одном месте. Спасибо за предупреждение!