我正在尝试添加和删除关键字:值'使用jq从JSON对象。我是新的使用jq,我不明白jq向我投掷的错误,所以任何帮助推动我正确的方向非常感谢。我的具体问题是我有一个JSON对象(下面),我希望能够从JSON对象添加/删除“maxHeight”键/值。
我尝试了一些错误的命令......
sudo rmmod pn533 ## unload the driver right now
sudo nfc-list ## now it works...
无法迭代null(null)
jq 'recurse(.[]) |= del(.maxHeight)' new.json
不能遍历字符串("功能")
jq 'recurse(.[]) |= {maxHeight}' new.json
无法使用字符串" style"
索引字符串
new.json文件看起来像这样......
jq 'recurse(.[]) |= .maxHeight' new.json
答案 0 :(得分:2)
有两种方法:
全局方法,忽略了特定的上下文。
以下说明了全球方法:
walk(if type == "object" and has("maxHeight") then del(.maxHeight) else . end)
这实际上是"编辑"通过更新任何具有指定键的对象来输入。
如果您的jq没有walk/1
,只需在调用之前包含其def(例如来自https://raw.githubusercontent.com/stedolan/jq/master/src/builtin.jq)。
答案 1 :(得分:2)
使用jq-1.6,这会从输入中删除键.maxHeight(如果之前不存在,它甚至不会抱怨):
jq 'del(.maxHeight)' new.json
答案 2 :(得分:1)
这里是一个示例,该示例从Electrum Wallet JSON文件中删除了几个键,这已在zsh和bash中进行了测试,其jq版本没有内置walk
:
jq -f <(
curl https://raw.githubusercontent.com/stedolan/jq/master/src/builtin.jq
echo 'walk('
for i in transactions spent_outpoints verified_tx3 txo txi addresses addr_history; do
echo 'if type == "object" and has("'"$i"'") then del(.'"$i"') else . end |'
done
echo '.)'
) ~/.electrum/testnet/wallets/default_wallet
答案 3 :(得分:0)
对于非常大的JSON文档,可能最好使用jq的“流解析器”来解决此类问题,至少在编辑操作大大减小文档大小的情况下。无论如何,这是一个使用--stream
选项的解决方案:
jq --stream 'select(length == 2 and .[0][-1] == "maxHeight" | not)' new.json |
jq -n 'fromstream(inputs)'
请注意,必须在第二次调用jq。
时使用-n
选项
答案 4 :(得分:0)
我遇到了类似的问题,但是不想为此花费很多代码或花太多时间。
我假设您已解决此问题。但对我而言,以下内容为我提供了不必递归寻找的值,即仅在顶级级别。另外,我不在乎是否存在空白/空值:
$ awk ' { c=$2; if(c-p>10 && NR>1 ) { print a,p; print $0 } p=c;a=$1 } ' waheed.txt
g 40
h 55
$ cat waheed.txt
a 12
b 16
c 19
d 25
e 28
f 38
g 40
h 55
i 56
j 59
k 62
$