我有一个包含多行的文件。 文件:
row1
row2
对于每一行,我想创建以下内容,其中第一组读取的后缀为“first”,第二组读取的后缀为“last”
[
{
"forward": "forward-row1-first",
"reverse": "reverse-row1-first"
},
{
"forward": "forward-row1-last",
"reverse": "reverse-row1-last"
}
]
接下来,我想将文件中每一行的上述结构组合起来,如下所示:
[
{
"reads": [
{
"forward": "forward-row1-first",
"reverse": "reverse-row1-first"
},
{
"forward": "forward-row1-last",
"reverse": "reverse-row1-last"
}
]
},
{
"reads": [
{
"forward": "forward-row2-first",
"reverse": "reverse-row2-first"
},
{
"forward": "forward-row2-last",
"reverse": "reverse-row2-last"
}
]
}
]
我有以下代码:
create_json () {
ROW="$1"
for SUFFIX in 1 2; do
FORWARD="forward-${ROW}_${SUFFIX}"
REVERSE="reverse-${ROW}_${SUFFIX}"
jq -n --arg forward "$FORWARD" --arg reverse "$REVERSE" '{forward: $forward, reverse: $reverse}'
done | jq -n '.reads |= [inputs]'
}
DATA=()
while read -r line; do
DATA+=($(create_json $line))
done < prefixes.txt
echo "${DATA[*]}"
这种方法的问题在于,文件中每一行的 json 对象都附加到 bash 数组中,输出如下所示:
{ "reads": [ { "forward": "forward-row1_first", "reverse": "reverse-row1_first" }, { "forward": "forward-row1_last", "reverse": "reverse-row1_last" } ] } { "reads": [ { "forward": "forward-row2_first", "reverse": "reverse-row2_first" }, { "forward": "forward-row2_last", "reverse": "reverse-row2_last" } ] }
如何以优雅的方式使用 jq 来获得所需的输出格式?
最佳答案
您可以使用-R
选项读取行文本文件。要迭代输入
,还可以使用-n
选项从第一行开始。
jq -Rn '
reduce inputs as $row ([]; . += [{reads: [("first", "last") as $sfx | {
forward: "forward-\($row)-\($sfx)",
reverse: "reverse-\($row)-\($sfx)"
}]}])
' rows.txt
[
{
"reads": [
{
"forward": "forward-row1-first",
"reverse": "reverse-row1-first"
},
{
"forward": "forward-row1-last",
"reverse": "reverse-row1-last"
}
]
},
{
"reads": [
{
"forward": "forward-row2-first",
"reverse": "reverse-row2-first"
},
{
"forward": "forward-row2-last",
"reverse": "reverse-row2-last"
}
]
}
]
关于jq 创建一个具有嵌套结构的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75605101/