如何迭代文件目录并使用jq和shell脚本保存到新文件?

时间:2015-03-17 18:21:08

标签: json shell jq

我正在使用jq(http://stedolan.github.io/jq/)从某些JSON文件中提取某些特定数据并将其转换为另一个JSON文件,例如:

cat data1.json | ./jq '[.["messages"][] | {to: .to, from: .from, body: .body, direction: .direction, date_sent: .date_sent }]' > results1.json

我在目录中有50个JSON文件来执行此操作。如何编写一些shell脚本来迭代所有50个文件,执行所述功能,并保存到50个擦除的JSON文件?

我正在考虑这些问题,但需要一些指导:

for file in *.json | ./jq | '[.["messages"][] | {to: .to, from: .from, body: .body, direction: .direction, date_sent: .date_sent }]' "$file" "$newfile.json" ; done

谢谢!

1 个答案:

答案 0 :(得分:3)

我不熟悉jq,因此可能有一些方法可以让它在一次调用中处理多个文件。这适用于每个文件调用一次:

#!/bin/bash

for file in *.json; do
    ./jq '[.["messages"...' < "$file" > "$file.scrubbed"
done

使用cat将输入重定向到文件是多余的。只需使用<代替。

如果您的输入文件遵循一致的命名方案,例如数据 n .json ,并且您希望调用输出文件,例如结果 n .json ,您可以使用> "${file/data/result}"代替(虽然它可能无法移植到某些非Bash shell)。注意这样你就不会意外地覆盖一些名称不包含&#34;数据&#34;虽然。在the Bash manual中搜索 $ {parameter / pattern / string}