У меня есть сценарий python, который проходит через некоторые журналы и решил, что было бы полезно сделать несколько тестов по сравнению с некоторыми другими подходами перед его развертыванием. Глядя на awk
, я надеюсь минимизировать накладные расходы, чтобы получить «справедливый» толчок при победе над несколько оптимизированным вариантом python.
Мои записи журнала выглядят так:
--------
SomeField=SomeValue
OptionallyAppearingField=WhoKnowsWhat
AnotherField=AnotherValue
ExtraStuff=OneBonusKey=1,SecondBonusKey=2,ThirdBonusKey=3,...
--------
И я стремлюсь получить значение AnotherField, когда один из наших ThirdBonusKey
s существует и имеет определенное значение (фактически только номер 1).
«Глупый» способ - установить RS
на '--------'
, а затем дважды применить регулярное выражение к $0
, сначала посмотреть, есть ли в записи ThirdBonusKey=1
, а затем выписка AnotherField=(desired_value)
.
Но это кажется несправедливым сравнением, учитывая, что он просто бросает регулярное выражение в задачу (дважды!). Без гарантированного упорядочения полей, чтобы использовать классные навыки FS awk
, есть ли более быстрый или более подходящий подход? Возможно, ответ просто «это не работа для awk
», и это тоже нормально, я думаю.
Сайрус любезно указал, что набросок кода, который я привел выше, технически не является кодом, и он технически корректен, поэтому вот довольно глупая реализация:
awk 'BEGIN{RS="--------"} { if ($0 ~ /ThirdBonusKey=1/) { for(i=1;i<NF;i++) {if ($i ~ "AnotherField=") { print $i }}}}'
Учитывая ввод
--------
SomeField=SomeValue
OptionallyAppearingField=WhoKnowsWhat
AnotherField=DesiredValue1
ExtraStuff=OneBonusKey=1,SecondBonusKey=2,ThirdBonusKey=1,...
--------
SomeField=SomeValue
OptionallyAppearingField=WhoKnowsWhat
AnotherField=DesiredValue2
ExtraStuff=OneBonusKey=1,SecondBonusKey=2,ThirdBonusKey=0,...
--------
SomeField=
ExtraStuff=
--------
мы ожидаем выхода
AnotherField=DesiredValue1