String

對 JSON 文件應用簡單的字元串映射

  • June 17, 2021

不知何故,我認為必須有一個單行來在命令行上應用簡單的映射。在這種情況下,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

以下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-Style Operators”的部分jq


如果使用 Dewey 映射文件作為索引並使用目錄中的 Dewey 程式碼查詢它感覺更自然:

jq -s '[
   JOIN(
       INDEX(.[0][]; .Dewey);
       .[1][];
       ."Call Number";
       { Title: .[0].Title, "Call Number": .[1].Congress }
   )
]' dewey_mappings catalog

引用自:https://unix.stackexchange.com/questions/654073