我有一个巨大的json文件(大约7GB),包含多个元素,我们称之为data.json
。每个元素看起来像这样:
{
"aggregation_bits": "0xf7fffffffffffdfffffffffffffdfffffffffffffffffffffff7fffffffffffffff7ff",
"data": {
"slot": "6436981",
"index": "8",
"beacon_block_root": "0xf8afce2fc26df10061d641633a7256cf47ffa8793771ae83e190e72bf2c5886e",
"source": {
"epoch": "201154",
"root": "0x694231a8135b3f546a6fe483ba6b467c686592f6d627aaf06b56ffbd78d75f63"
},
"target": {
"epoch": "201155",
"root": "0x2fc0d9f58cda026678d98f010fec13d202eec4ec9ae4dbd57878413a75fe22d7"
}
},
"signature": "0xadb0d576ee418e37017f423e77622ce85bdb741d0e984e78df3a250c172fc67c6c7ec94e4802d6323aee8f62b7df218300f42010fe673ed85f4e06d1361336474ecfb4db39aa2bc31b31bf6fbe52c7bff769f024faa5ba3554d5ea02fe9663c3",
"arrival": 1684067808365
}
我想做的是使用jq
脚本来选择包含特定值的slot的所有元素,并将它们保存在单独的json文件中,我们称之为data_for_slot.json
让我们假设所有元素都是slot = 6436990
。为此,我使用了:
jq -c '[select(.data.slot == "6436990")]' data.json > data_for_slot.json
运行一段时间后,它返回data_for_slot.json
,但当我打开它检查时,我得到的是:
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
...
我知道slot = 6436990
存在于某些元素中,所以我期待一个这样的元素数组,但得到了这个。我不明白为什么它返回这样的结果,而不抛出任何错误。
我对jq
脚本非常陌生,如果有人能告诉我我做错了什么,什么是正确的方法,我将不胜感激。
1条答案
按热度按时间vojdkbi01#
jq过滤器
[select(.data.slot == "6436990")]
将为每个输入项创建一个数组[…]
。当您使用select(…)
过滤掉(大部分)输入项时,您会得到一个(大部分)空数组流。删除数组括号(只需使用
select(…)
),不匹配的输入项将不会有输出。