jq 创建一个具有嵌套结构的数组

标签 jq

我有一个包含多行的文件。 文件:

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/

相关文章:

json - 使用jq将CSV转换为JSON

json - 如何使用 jq 查找某个键的所有路径

json - 基于 CSV 将 JSON 对添加到 JSON 文件

json - 使用jq修改JSON

json - Curl 和 jq 替换值中的子字符串

bash - 如何管理 jq 将 bool 值返回给 bash 以供将来继续

json - 如何使用jq解析一个json对象数组

bash - 用jq/yq遍历

json - 如何混合来自jq的json级别

json - 如何将变量传递到 JQ select/contains 查询中