मेरे पास नीचे दी गई एक json फ़ाइल है जिसे data.json कहा जाता है, मैं jq टूल के साथ स्ट्रीमिंग मोड में डेटा को पार्स करना चाहता हूं (पूरी फ़ाइल को मेमोरी में लोड न करें), क्योंकि वास्तविक डेटा में 20GB होता है

Jq में स्ट्रीमिंग मोड एक ध्वज --स्ट्रीम जोड़ने लगता है और यह पंक्ति द्वारा json फ़ाइल पंक्ति को पार्स करेगा

{
  "id": {
    "bioguide": "E000295",
    "thomas": "02283",
    "govtrack": 412667,
    "opensecrets": "N00035483",
    "lis": "S376"
  },
  "bio": {
    "gender": "F",
    "birthday": "1970-07-01"
  },
  "tooldatareports": [
    {
      "name": "A",
      "tooldata": [
        {
          "toolid": 12345,
          "data": [
            {
              "time": "2021-01-01",
              "value": 1
            },
            {
              "time": "2021-01-02",
              "value": 10
            },
            {
              "time": "2021-01-03",
              "value": 5
            }
          ]
        },
        {
          "toolid": 12346,
          "data": [
            {
              "time": "2021-01-01",
              "value": 10
            },
            {
              "time": "2021-01-02",
              "value": 100
            },
            {
              "time": "2021-01-03",
              "value": 50
            }
          ]
        }
      ]
    }
  ]
}

अंतिम परिणाम मुझे आशा है कि यह नीचे जैसा हो सकता है

एक सूची में दो ताना होते हैं, प्रत्येक ताना में 2 कुंजियाँ होती हैं

[
  {
    "data": [
      {
        "time": "2021-01-01",
        "value": 1
      },
      {
        "time": "2021-01-02",
        "value": 10
      },
      {
        "time": "2021-01-03",
        "value": 5
      }
    ]
  },
  {
    "data": [
      {
        "time": "2021-01-01",
        "value": 10
      },
      {
        "time": "2021-01-02",
        "value": 100
      },
      {
        "time": "2021-01-03",
        "value": 50
      }
    ]
  }
]

इस समस्या के लिए, मैं परिणाम प्राप्त करने के लिए नीचे दी गई कमांड लाइन का उपयोग करता हूं, लेकिन इसमें अभी भी कुछ अंतर हैं।

कैट डेटा.जेसन | jq --stream 'select(.[0][0]=="tooldatareports" and .[0][2]=="tooldata" and [1]!=null) | ।'

  1. परिणाम एक सूची नहीं है जिसमें बहुत सारे निर्देश हैं
  2. प्रत्येक समय के लिए और मूल्य अलग-अलग सूची में अलग होते हैं

क्या किसी को इस बारे में कोई जानकारी है?

1
CYC 3 सितंबर 2021, 18:49

2 जवाब

सबसे बढ़िया उत्तर

यहां एक समाधान दिया गया है जो truncate_stream का उपयोग नहीं करता है:

jq -n --stream '
 [fromstream( 
   inputs
   | (.[0] | index("data")) as $ix
   | select($ix)
   | .[0] |= .[$ix:] )]
' input.json
1
peak 3 सितंबर 2021, 17:33

निम्नलिखित आवश्यक आउटपुट उत्पन्न करता है:

jq -n --stream '
  [{data: fromstream(5|truncate_stream(inputs))}]
' input.json 

कहने की जरूरत नहीं है, अन्य विविधताएं भी हैं ...

0
peak 3 सितंबर 2021, 17:24