2015-02-22 2 views
0

мне нужно обработать вывод, который выглядит, как показано ниже:AWK разбор вывода и извлечение значений

my_first_key: {i}text 
my_first_key: {j}different_text 
my_first_key: {k}some_text 
my_second_key: value1 
my_first_key: {l}some_text 
my_second_key: value2 

Линия всегда начинается с одного из двух ключей, а затем : затем пробела, то либо индекс в фигурных скобках для одного ключа , или сразу же значение для второго ключа. Строке с ключом второго типа и значению всегда предшествует строка с первым ключом и индексом.

Мне нужно две функции:

  1. array(): возвратить массив в качестве {k:value1, l:value2}.
  2. index(value), чтобы вернуть значение индекса из предыдущей строки, так index(value2) возвращает l.

Я вижу примеры, чтобы вернуть номера строк и т.д., но мой awk уровень 0.

[От Моше комментарий] Алгоритм таков:

a) awk '/$value/{ print NR; exit }' 
b) awk 'NR==$(previous_return - 1) 
c) awk '{split($0,a,"{}") | print a[2] 
+2

Каков ваш ожидаемый результат над образцом? – anubhava

+0

в зависимости от того, какая функция вызывается. array() вернет {k: значение1, l: значение2}. это может быть две строки $ index: $ value или что-то еще. index (value1) возвращает 'k', а index (value2) возвращает 'l' и т. д. –

+2

Да, чтобы эхо anubhava, отредактируйте свой вопрос, чтобы добавить для каждой функции ожидаемый результат, и, пожалуйста, убедитесь, что это точный результат, который вы ожидаете от вход, который вы уже разместили. – jas

ответ

3

Я не слишком много времени, но следующая программа должна помочь вам решить первую точку. Это строго основано на вашем примере. Из вашего примера входных данных, я заменил алфавитных индексирует I, J, K и L с 1,2,3,4, поэтому тестовый файл содержит:

*my_first_key: {1}text 
my_first_key: {2}different_text 
my_first_key: {3}some_text 
my_second_key: value1 
my_first_key: {4}some_text 
my_second_key: value2* 

и программа:

BEGIN { 
    # split on braces to have the index from my_first_key: in field #2 without effort 
    FS="[{}]" 
} 
/^my_first_key:/ { ix=$2} 
/^my_second_key:/ { 
    sub(/^my_second_key: */, "") # leaves only value2 in $0 
    if (first_done==0) { 
    buffer["index1"]=ix 
    buffer["value1"]= $0 
    first_done=1 
    } 
    else { # first_done == 1 
    printf ("{%s:%s, %s:%s}\n", buffer["index1"], buffer["value1"], ix, $0) 
    first_done=0 
    } 
} 

и выходной сигнал:

awk -f example.awk test.data 
{3:value1, 4:value2} 
+0

Спасибо, что нашли время. Ты жжешь!!! Я попробую это! –

+1

Вы, очевидно, гений, в дополнение к тому, чтобы быть очень щедрым человеком. Я собираюсь выделить время, чтобы понять, что вы сделали, после того, как я оставил остальную часть проекта. На данный момент я лишь частично понимаю, почему ваш пример функционирует по мере необходимости. Это действительно работает. Еще раз спасибо. –

+0

@MosheShmukler: Повторить замечания, высказанные в комментариях: сначала узнайте, что лучшие вопросы по S.O. включают в себя: 1. небольшой набор выборочных данных, охватывающих ожидаемые случаи, и 1 или 2 случая ошибок; 2. ожидаемый результат из данных «ожидаемого случая»; 3. ваша попытка решить вашу проблему, как в коде, так и в p-коде; ваш текущий результат, включая точные сообщения об ошибках (но разумную длину), 5. используемые версии ОС и утилиты, если они не являются суперстандартными Linux (bash V> 3 и т. д.). 6. Любая другая соответствующая информация («Я уже попробовали X, Y, Z, и они не работали »). Удачи! – shellter

Смежные вопросы