Получить отдельные поля k, v из одной строки в bash-скрипте - PullRequest
0 голосов
/ 11 марта 2012

Я читаю строку данных в этой форме:

KEYNAME:value,KEYNAME:value,KEYNAME:value

(обратите внимание, ключи - это строки без пробелов, а значения - целые числа)

Мне нужно выбрать некоторые конкретные ключи (беззная их относительные позиции) и печатая их значения в отдельных строках:

value
value
value

До сих пор я пришел к чему-то вроде преобразования строки ввода в несколько ключей KEY: строки значений, выделение нужных мне клавиш, наложение известного порядкаи, наконец, пропустив это снова через cut, чтобы удалить ключевую часть:

sed 's/,/\n/g' | egrep '(FooKey|BarKey|BazKey)' | sort | cut -d':' -f2

Я думал, что смогу что-то упорядочить с помощью awk, из которых я просто знаю основы, но я могу управлять полями только по их позиционному порядкуне по имени (ключевому имени).

Может быть сделано с другими языками (например, Python или Perl), но я воспринимаю это как упражнение, чтобы делать все с помощью обычных инструментов оболочки.Кроме того, я бы все же предпочел вышеуказанные решения загрузке большего интерпретатора, такого как python или perl.

Ответы [ 2 ]

1 голос
/ 11 марта 2012
awk 'BEGIN { FS=":"; RS = ","; } /FooKey|BarKey|BazKey/ { print $1 }'
1 голос
/ 11 марта 2012

При этом будут напечатаны только значения:

awk 'BEGIN { RS=","; FS=":" } { print $2 }'

Если вы хотите, чтобы значения были в определенном порядке, вы можете поместить их в массив:

awk '
    BEGIN { RS=","; FS=":" }
    { values[$1] = $2 }
    END {
        print values["FooKey"];
        print values["BarKey"];
    }'
...