由于数据看起来像映射对象,甚至对应于 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>"。