我有以下问题:
*我想要一个JSON文件的键,{"key1","key2"}每个有几个值,并写入一个txt文件。每个密钥的txt文件如下所示:
key1.txt:
val1
val2
val3
..
和类似的结构用于key2.txt。使用这些,我想创建一个json文件,具有以下结构:
{
key1:
[ "val1"
"val2"
...
]
key2:
[ "val1"
"val2"
...
]
}
我希望你的问题很清楚。如果可能的话,我更喜欢使用bash。
#!/bin/bash
json="{"
for f in <path of directory>/*.txt
do
filename=$(basename "$f")
filename="${filename%.*}"
json=$json'"'$filename'"'": ["
while IFS= read -r line; do
echo $filename
json=$json'"'$line'",'
done < $f
json="${json%?}"
json=$json"],"
done
json="${json%?}"
json=$json"}"
echo $json
jq可用于使用--slurpfile
选项读取多个文件。但是文件必须是一个实际的json文件。因为你的文件不是json格式的,所以你需要转换它们。
$ jq -R '.' key1.txt > /tmp/key1.json &&
jq -R '.' key2.txt > /tmp/key2.json &&
jq --slurpfile key1 /tmp/key1.json
--slurpfile key2 /tmp/key2.json
-n '{ key1: $key1, key2: $key2 }'
否则,如果你不想处理临时文件,你可以使用子shell来创建json数组,并使用--argjson
传递它们。
$ jq --argjson key1 "$(jq -R '.' key1.txt | jq -s '.')"
--argjson key2 "$(jq -R '.' key2.txt | jq -s '.')"
-n '{ key1: $key1, key2: $key2 }'
使用循环构建条目数组,然后将循环输出与最终的jq调用合并。
for f in *.txt; do
<"$f" jq -nR --arg key "${f%.txt}" '{$key,value:[inputs]}';
done | jq -s 'from_entries'
请注意,这个问题的答案非常类似于如何使用jq从其他文件读取内容来更新json文件?在shell脚本循环中使用jq工具构造json