2015-11-27 38 views
1

我有一个JSON数据作为data.json文件迭代通过JSON阵列中壳牌脚本

[{"original_name":"pdf_convert","changed_name":"pdf_convert_1"},{"original_name":"video_encode","changed_name":"video_encode_1"},{"original_name":"video_transcode","changed_name":"video_transcode_1"}] 

我想通过阵列迭代和为在一个循环中的每个元素中提取的值如下。我看到了jq。我发现很难用它来迭代。我怎样才能做到这一点?

+0

看起来'jq'有'foreach'命令,你试过了吗? – Kevin

+0

老实说,我认为你会对一个简单的Python脚本更满意。您甚至可以使用heredoc语法将它嵌入到shell脚本中。 – 5gon12eder

+0

你可以举一个嵌入python到shell脚本的例子吗? – user3288346

回答

0

尝试围绕此示例进行构建。 (来源:原始网站)

实施例:

jq '[foreach .[] as $item ([[],[]]; if $item == null then [[],.[0]]  else [(.[0] + [$item]),[]] end; if $item == null then .[1] else empty end)]' 

Input [1,2,3,4,null,"a","b",null]

Output [[1,2,3,4],["a","b"]]

+0

原始问题含糊不清,但我不认为用户需要“foreach”是必要的。 – chepner

6

只需使用一个过滤器,将所述阵列中返回每个项目。然后循环查看结果,只要确保使用紧凑输出选项(-c),以便将每个结果放在一行中,并将其视为循环中的一个项目。

jq -c '.[]' input.json | while read i; do 
    # do stuff with $i 
done 
+1

'for'循环迭代空白分隔的单词,而不是行。 – chepner

+0

是的,你是对的,虽然在这个特定的情况下,它可能没有问题,因为任何对象都没有空格。但这个想法仍然是一样的,循环机制可能是错误的选择。 –

1

在这个线程较早的答案用JQ的foreach建议,但是这可能比需要的更复杂,尤其是考虑到既定的任务。具体而言,foreach(和reduce)适用于需要累积结果的某些情况。

在很多情况下(包括最终需要减少一些步骤的情况),最好使用.[]map(_)。后者只是另一种写作方式[。] _],所以如果你打算使用jq,理解这一点真的很有用。[]简单地创建了一个的值。 例如,[1,2,3] | .[]会生成三个值的流。

想要一个简单的map-reduce示例,假设您想要查找一个字符串数组的最大长度。一种解决方案是[ .[] | length] | max