不知何故,我认为必须有一个单行代码来在命令行上应用简单的映射。在这种情况下,JSON 中的键将(像往常一样)提供上下文,确保我们不会愚蠢地替换不应该替换的字符串。
假设我们使用 JSON 文件给出了一个图书馆目录 杜威十进制分类法
[
{
"Title": "Design Pattern",
"Call Number": "005.12 DES"
},
{
"Title": "Intro to C++",
"Call Number": "005.133 C STR"
}
]
以及杜威和 国会图书馆 电话号码
[
{
"Dewey": "005.12 DES",
"Congress": "QA76.64 .D47 1995X"
},
{
"Dewey": "005.133 C STR",
"Congress": "QA76.73.C153 S77 2013"
}
]
并想要生成输出文件:
[
{
"Title": "Design Pattern",
"Call Number": "QA76.64 .D47 1995X"
},
{
"Title": "Intro to C++",
"Call Number": "QA76.73.C153 S77 2013"
}
]
jq
这仍然适合将处理的单行转换集吗?
答案1
以下jq
命令:
jq -s '[
JOIN(
INDEX(.[0][]; ."Call Number");
.[1][];
.Dewey;
{ Title: .[1].Title, "Call Number": .[0].Congress }
)
]' catalog dewey_mappings
这将使用 分别将两个文件读入一个数组,如.[0]
和。.[1]
jq -s
索引是根据第一个文件的Call Number
字段计算的。该索引用于JOIN
对Dewey
第二个文件的字段进行关系操作。
从提取的元素对中,创建JOIN
一个对象,该对象的Title
字段取自第二个文件的字段Title
,Call Number
字段取自第一个文件的字段。Congress
所有创建的对象都放入一个数组中(因此[
和]
周围JOIN
)。
结果将是这样的 JSON 文档:
[
{
"Title": "Design Pattern",
"Call Number": "QA76.64 .D47 1995X"
},
{
"Title": "Intro to C++",
"Call Number": "QA76.73.C153 S77 2013"
}
]
另请参阅手册中标题为“SQL 样式运算符”的部分jq
。
如果使用杜威映射文件作为索引并使用目录中的杜威代码查询它感觉更自然:
jq -s '[
JOIN(
INDEX(.[0][]; .Dewey);
.[1][];
."Call Number";
{ Title: .[0].Title, "Call Number": .[1].Congress }
)
]' dewey_mappings catalog