使用 JQ - 拆分和修改后加入记录
Using JQ - Join records after been split and modified
我有一个数组,其中一些记录需要复制。 id值可能是由“;”连接的2个字符串,如下
{"_time": "2022-02-20T23","csp_name": "1","tool_bf_id": "1234", "id":"aa-1111;aa-2222"}
或 id 值为 null 或只有 1 个 ref:
{"_time": "2022-02-20T23","csp_name": "3","tool_bf_id": "1357", "dvc_ssr": "null"}
{"_time": "2022-02-20T23","csp_name": "4","tool_bf_id": "2468", "dvc_ssr": "aa-3333"}
我可以复制这条记录并得到以下信息:
{"_time": "2022-02-20T23","csp_name": "1","tool_bf_id": "1234", "dvc_ssr": "aa-1111","id":"aa-1111;aa-2222"},
{"_time": "2022-02-20T23","csp_name": "1","tool_bf_id": "1234", "dvc_ssr": "aa-2222","id":"aa-1111;aa-2222"}
感谢另一个post:
我通过加入来自另一个文件的数据来修改我的记录:
{"_time":"2022-02-20T23","csp_name":"1","tool_bf_id":"1234","id":"aa-1111;aa-2222", "dvc_ssr":"aa-1111","host":"hostId1"}
,{"_time":"2022-02-20T23","csp_name":"1","tool_bf_id":"1234","id":"aa-1111;aa-2222","dvc_ssr":"aa-2222","host":"hostId2"}
现在我需要将记录合并回去并加入新添加字段(大约 10 个)的值
{"_time": "2022-02-20T23","csp_name": "1","tool_bf_id": "1234", "id":"aa-1111;aa-2222", "host": "hostId1;hostId2"}
hosts.jsonl
:
{ "host": "hostId1", "dvc_ssr": "aa-1111" }
{ "host": "hostId2", "dvc_ssr": "aa-2222" }
{ "host": "hostId3", "dvc_ssr": "aa-3333" }
records.jsonl
:
{ "_time": "2022-02-20T23", "csp_name": "1", "tool_bf_id": "1234", "id":"aa-1111;aa-2222" }
{ "_time": "2022-02-20T23", "csp_name": "3", "tool_bf_id": "1357", "dvc_ssr": "null" }
{ "_time": "2022-02-20T23", "csp_name": "4", "tool_bf_id": "2468", "dvc_ssr": "aa-3333" }
jq -n --slurpfile hosts hosts.jsonl '
INDEX( $hosts[]; .dvc_ssr ) as $host_lkup |
inputs |
.host =
if has("dvc_ssr") then
$host_lkup[.dvc_ssr].host
elif has("id") then
.id / ";" | map( $host_lkup[.].host ) | join(";")
else
null
end
' records.jsonl
输出:
{
"_time": "2022-02-20T23",
"csp_name": "1",
"tool_bf_id": "1234",
"id": "aa-1111;aa-2222",
"host": "hostId1;hostId2"
}
{
"_time": "2022-02-20T23",
"csp_name": "3",
"tool_bf_id": "1357",
"dvc_ssr": "null",
"host": null
}
{
"_time": "2022-02-20T23",
"csp_name": "4",
"tool_bf_id": "2468",
"dvc_ssr": "aa-3333",
"host": "hostId3"
}
Demo 在 jqplay
我有一个数组,其中一些记录需要复制。 id值可能是由“;”连接的2个字符串,如下
{"_time": "2022-02-20T23","csp_name": "1","tool_bf_id": "1234", "id":"aa-1111;aa-2222"}
或 id 值为 null 或只有 1 个 ref:
{"_time": "2022-02-20T23","csp_name": "3","tool_bf_id": "1357", "dvc_ssr": "null"}
{"_time": "2022-02-20T23","csp_name": "4","tool_bf_id": "2468", "dvc_ssr": "aa-3333"}
我可以复制这条记录并得到以下信息:
{"_time": "2022-02-20T23","csp_name": "1","tool_bf_id": "1234", "dvc_ssr": "aa-1111","id":"aa-1111;aa-2222"},
{"_time": "2022-02-20T23","csp_name": "1","tool_bf_id": "1234", "dvc_ssr": "aa-2222","id":"aa-1111;aa-2222"}
感谢另一个post:
我通过加入来自另一个文件的数据来修改我的记录:
{"_time":"2022-02-20T23","csp_name":"1","tool_bf_id":"1234","id":"aa-1111;aa-2222", "dvc_ssr":"aa-1111","host":"hostId1"}
,{"_time":"2022-02-20T23","csp_name":"1","tool_bf_id":"1234","id":"aa-1111;aa-2222","dvc_ssr":"aa-2222","host":"hostId2"}
现在我需要将记录合并回去并加入新添加字段(大约 10 个)的值
{"_time": "2022-02-20T23","csp_name": "1","tool_bf_id": "1234", "id":"aa-1111;aa-2222", "host": "hostId1;hostId2"}
hosts.jsonl
:
{ "host": "hostId1", "dvc_ssr": "aa-1111" }
{ "host": "hostId2", "dvc_ssr": "aa-2222" }
{ "host": "hostId3", "dvc_ssr": "aa-3333" }
records.jsonl
:
{ "_time": "2022-02-20T23", "csp_name": "1", "tool_bf_id": "1234", "id":"aa-1111;aa-2222" }
{ "_time": "2022-02-20T23", "csp_name": "3", "tool_bf_id": "1357", "dvc_ssr": "null" }
{ "_time": "2022-02-20T23", "csp_name": "4", "tool_bf_id": "2468", "dvc_ssr": "aa-3333" }
jq -n --slurpfile hosts hosts.jsonl '
INDEX( $hosts[]; .dvc_ssr ) as $host_lkup |
inputs |
.host =
if has("dvc_ssr") then
$host_lkup[.dvc_ssr].host
elif has("id") then
.id / ";" | map( $host_lkup[.].host ) | join(";")
else
null
end
' records.jsonl
输出:
{
"_time": "2022-02-20T23",
"csp_name": "1",
"tool_bf_id": "1234",
"id": "aa-1111;aa-2222",
"host": "hostId1;hostId2"
}
{
"_time": "2022-02-20T23",
"csp_name": "3",
"tool_bf_id": "1357",
"dvc_ssr": "null",
"host": null
}
{
"_time": "2022-02-20T23",
"csp_name": "4",
"tool_bf_id": "2468",
"dvc_ssr": "aa-3333",
"host": "hostId3"
}
Demo 在 jqplay