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

mis*_*p_n 4 shell json 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
Run Code Online (Sandbox Code Playgroud)

我在一个目录中有 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
Run Code Online (Sandbox Code Playgroud)

谢谢!

Ulf*_*zer 6

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

#!/bin/bash

for file in *.json; do
    ./jq '[.["messages"...' < "$file" > "$file.scrubbed"
done
Run Code Online (Sandbox Code Playgroud)

使用cat的输入重定向到一个文件是多余的。换用就好了<

如果您的输入文件遵循一致的命名方案,例如data n .json并且您希望输出文件被调用,例如result n .json,您可以> "${file/data/result}"改用(尽管它可能无法移植到某些非 Bash shell)。小心,以免意外覆盖名称不包含“数据”的文件。在Bash 手册中搜索${parameter/pattern/string}