#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 Ах да, была опечатка, которую я, по-видимому, исправил только в одном месте. Спасибо за предупреждение!