我身边有3K一个目录内的 JSON 文件,每个文件大约包含 250 个(+/-)其中的 JSON 元素,我想将这些文件中的 JSON 元素总数计算为总和。
目前使用jq
如下命令,该命令返回每行中的数字,但我想通过添加它们来计算总数,
jq length *.json
电流输出,
250
248
250
240
...
...
250
预期输出(大约),
600530
答案1
仅使用jq
:
jq -s 'map(length) | add' ./*.json
-s
/--slurp
将jq
其输入作为单个数组读取,仅对其运行指定的过滤器一次。map
用于运行length
该虚拟数组的每个元素,返回一个数字数组,add
最后对它们求和。
还要确保不达到命令行长度限制(但请注意,这也会递归处理子目录1中的文件):
find . -name "*.json" -exec jq 'length' {} + | jq -s 'add'
找到的文件将分批传递,jq 'length'
其大小取决于系统允许的最大命令行长度。由于find
可能会运行jq
多次,因此让它吸食其输入将无法可靠地工作,并且其输出会通过管道输送到第二个(吸食)jq
。
1 该站点上的几个问答展示了如何防止find
下降到目录中;例如,非递归地使用“查找”?
答案2
您可以使用简单的awk
命令即
jq length ./*.json | awk '{sum=sum+$0} END{print sum}'