И решение с использованием awk
:
awk -F';' '{ gsub(/ /,"");}
NR==1 { cols = split($0, col); }
NR > 2 { for (i = 2; i <= cols; i++) {
data[col[i]";"$1] = $1";"col[i]";"$i; }
}
END { no = asorti(data, sorted);
for (i = 1; i <= no; i++) {
print data[sorted[i]]; }
}' input
@sudobash хорошо, обновляю свой предыдущий комментарий, это было не решение, а скорее вопрос. Я знаю, что этот вопрос уже давно не задавался, но вот решение на случай, если оно кому-то понадобится в будущем:
Если вы наведете указатель мыши на поле «теги», вы увидите, что это должно быть поле «Строка», что неверно , и вот как вы можете подтвердить это :] Согласно официальной документации Elasticsearch , при фильтрации можно использовать следующие условия:
equality: ==, !=, <, >, <=, >=
regexp: =~, !~ (checks a pattern on the right against a string value on the left)
inclusion: in, not in
Если вы обратите внимание, вы увидите, что вы можете использовать «regexp» для сравнения строк, но почему это не работает для «тегов»? Что ж, ответ заключается в том, что «теги» не являются строковым полем, это поле/объект «массива» , поэтому любое сравнение должно указывать на определенные позиции массива.
Если, например, вы используете этот фильтр в конвейере Logstash:
filter {
if [tags][0] =~ /foo.*/ {
mutate { add_tag => "worked" }
}
}
он будет работать так, как ожидалось, в приведенном выше примере, если позиция [0] «тегов» соответствует условию регулярного выражения «foo. *», новое значение («работает» )будет добавлен в массив тегов.
Теперь я понимаю, что в реальной жизни это не будет полезно, потому что вы, вероятно, не знаете позицию в массиве тега, который хотите сравнить, верно? Таким образом, из коробки нет способа добиться этого, для этого вам придется использовать рубиновый фильтр. Обратитесь к этому посту .
Вот базовый рубиновый фильтр, который будет делать то же самое, что я делал в предыдущем примере с фильтром, но на этот раз он будет делать это динамически:
filter {
ruby {
code => '
mbool = 0
event.get("tags").each_index { |x|
if event.get("tags")[x] =~ /foo.*/
mbool = 1
end
}
if mbool == 1
event.tag("ruby-worked")
end
'
}
Конечно,это зависит от того, чего вы хотите достичь в конце, но я почти уверен, что этот пост будет полезен.