Поскольку данные выглядят как объекты сопоставления и даже соответствуют формату JSON, нужно сделать что-то подобное, если вы не возражаете против использования поддержки Python (которая поставляется с JSON):
import json
def get_id_hw(s):
d = json.loads(s)
return '"id":"{}","hwVersion":"{}"'.format(d["id"], d["hwVersion"])
Мы берем строку входной строки в s
и анализируем ее как JSON в словаре d
. Затем мы возвращаем отформатированную строку со строками id
и hwVersion
в двойных кавычках, за которыми следуют столбец и значение в двойных кавычках соответствующего ключа из ранее полученного dict
.
Мы можем попробовать это с помощью этого теста входные строки и печать:
# These will be our test inputs.
s1 = '{"id":"1111","name":"2222","versionCurrent":"3333","hwVersion":"4444"}'
s2 = '{"id":"5555","name":"6666","hwVersion":"7777"}'
# we pass and print them here
print(get_id_hw(s1))
print(get_id_hw(s2))
Но мы можем точно так же перебрать строки любого ввода.
Если вы действительно хотите использовать awk
, вы можете, но это не Самый надежный и подходящий инструмент:
awk '{ i = gensub(/.*"id":"([0-9]+)".*/, "\\1", "g")
h = gensub(/.*"id":"([0-9]+)".*/, "\\1", "g")
printf("\"id\":\"%s\",\"hwVersion\":\"%s\"\n"), i, h}' /your/file
Поскольку вы упоминаете, что положение неизвестно и предполагается, что оно может быть в любом порядке, мы используем одно регулярное выражение для извлечения id
, а другое для получения hwVersion
, затем мы распечатываем его в заданном формате. Если значения могли бы быть чем-то иным, чем десятичные цифры, как в вашем примере, [0-9]+
, но это должно было бы отражать это.
И для удовольствия, если это (это сохраняет порядок), если записи из файла, в sed
:
sed -e 's#.*\("\(id\|hwVersion\)":"[0-9]\+"\).*\("\(id\|hwVersion\)":"[0-9]\+"\).*#\1,\3#' file
Он ищет две группы "id"
или "hwVersion"
, за которыми следует :"<DECIMAL_DIGITS>"
.