Arrays 使用jq替换字典中的txt文件数组字符串值
我有一本这样的字典:Arrays 使用jq替换字典中的txt文件数组字符串值,arrays,json,bash,dictionary,jq,Arrays,Json,Bash,Dictionary,Jq,我有一本这样的字典: { "uid": "d6fc3e2b-0001a", "name": "ABC Mgmt", "type": "host" } { "uid": "d6fc3e2b-0002a", "name": "Server XYZ", "type": "group" } { "uid": "d6fc3e2b-0003a", "name": "NTP Primary", "type": "host" } { "uid": "d6fc3e2b-00
{
"uid": "d6fc3e2b-0001a",
"name": "ABC Mgmt",
"type": "host"
}
{
"uid": "d6fc3e2b-0002a",
"name": "Server XYZ",
"type": "group"
}
{
"uid": "d6fc3e2b-0003a",
"name": "NTP Primary",
"type": "host"
}
{
"uid": "d6fc3e2b-0004a",
"name": "H-10.10.10.10",
"type": "host"
}
然后我有一个txt文件:
"d6fc3e2b-0001a"
"d6fc3e2b-0001a","d6fc3e2b-0002a","d6fc3e2b-0003a"
"d6fc3e2b-0004a"
预期产出:
"ABC Mgmt"
"ABC Mgmt","Server XYZ","NTP Primary"
"H-10.10.10.10"
我在使用非json格式的数组制作jq时遇到了一些麻烦。我尝试了我找到的各种解决方案,但都不管用。我对脚本编写相当陌生,需要一些帮助
input=file.txt
while IFS= read -r line
do
{
value=$(jq -r --arg line "$line" \
'from_entries | .[($line | split(","))[]]' \
dictionary.json)
echo $name
}
done < "$input"
input=file.txt
而IFS=读取-r行
做
{
value=$(jq-r--arg行“$line”\
'来自|.[($line | split(“,”)[])”\
(dictionary.json)
echo$name
}
完成<“$input”
在以下解决方案中,使用--slurpfile
命令行选项读取字典文件,使用输入和-n命令行选项读取“text”行。-r命令行选项与@csv
过滤器一起使用,以生成所需的输出
调用
program.jq
警告
以上假设stream.txt中引用的值本身不包含逗号
如果stream.txt中引用的值确实包含逗号,那么如果stream.txt中每一行上的值都作为JSON实体(例如字符串数组)或JSON字符串序列(不带分隔符)提供,则会容易得多
注释中描述的问题的解决方案
调用
原始stream.txt是从JSON文件中以以下格式查询的。{“source”:[“d6fc3e2b-0001a”,“d6fc3e2b-0002a”]}{“source”:[“d6fc3e2b-0002a”,“d6fc3e2b-0003a”,“d6fc3e2b-0004a”]}是否有其他方法直接从流JSON实体获得相同的结果?是的,这使事情变得更简单!我是这方面的初学者。您能否提供从JSON流获取结果的解决方案?请参阅“注释中描述的问题的解决方案”。
jq -n -R -r --slurpfile dict stream.json -f program.jq stream.txt
(INDEX($dict[]; .uid) | map_values(.name)) as $d
| inputs
| split(",")
| map(fromjson)
| map($d[.])
| @csv
< original.json jq -r --slurpfile dict stream.json -f program.jq
(INDEX($dict[]; .uid) | map_values(.name)) as $d
| .source
| map($d[.])
| @csv