簡體   English   中英

如何使用 jq 1.5 刪除散列數組 JSON 輸入的 hash 中的最后一個“列”?

[英]How to remove last "column" in a hash of an array of array of hashes JSON input using jq 1.5?

我想轉換以下 JSON 內容存儲在文件 tmp.json

{
    "results": [
        [
           {
               "field": "field1",
               "value": "value1-1"
           },
           {
               "field": "field2",
               "value": "value1-2"
           },
           {
               "field": "field3",
               "value": "value1-3"
           }
        ],
        [
           {
               "field": "field1",
               "value": "value2-1"
           },
           {
               "field": "field2",
               "value": "value2-2"
           },
           {
               "field": "field3",
               "value": "value2-3"
           }
        ],
        [
           {
               "field": "field1",
               "value": "value3-1"
           },
           {
               "field": "field2",
               "value": "value3-2"
           },
           {
               "field": "field3",
               "value": "value3-3"
           }
        ]
    ]
}

進入 CSV output:

"field1","field2"
"value1-1","value1-2"
"value2-1","value2-2"
"value3-1","value3-2"

我想出的最接近的 jq 表達式是:

cat ./tmp.json | jq -r '.results | [ .[] | del(last) ] | (first | map(.field)), (.[] | map(.value)) | @csv'

它適用於 jq 1.6 版,但對於 1.5 版,最后一個“列”仍包含在 CSV 結果中。 如何編輯 jq 代碼以使其適用於 1.5 版?

注意列數不限於3; 它可以更多。 jq 代碼應該能夠刪除最終 CSV 結果中的最后一列。

您可以使用切片運算符提取每個字段內的數組子元素並放入數組中並使用@csv

[ .results[][:-1] ] | (first | map(.field)), (.[] | map(.value)) | @csv

.results[][:-1]部分提取數組中除最后一個元素之外的所有元素。 從手冊

任何一個索引都可以是負數(在這種情況下,它從數組的末尾向后計數),或者被省略(在這種情況下,它指的是數組的開頭或結尾)。

有關工作演示,請參閱jqplay


我能夠重現 jq-1.5 中的錯誤。 眾所周知的事實是,在 del/1 中修復了作為 1.6 版的一部分的主要錯誤。 因此,請考慮升級以使用 del/1 或使用上面答案中指示的切片表達式

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM