输出以分号分隔的字符串

Bow*_*owi 6 bash json export-to-csv jq

让我们说我们有这个文件:

{
  "persons": [
    {
      "friends": 4,
      "phoneNumber": 123456,
      "personID": 11111
    },
    {
      "friends": 2057,
      "phoneNumber": 432100,
      "personID": 22222
    },
    {
      "friends": 50,
      "phoneNumber": 147258,
      "personID": 55555
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

我现在想提取的人的电话号码11111,22222,33333,4444455555以分号分隔的字符串:

123456;432100;;;147258
Run Code Online (Sandbox Code Playgroud)

在跑步的时候

cat persons.txt | jq ".persons[] | select(.personID==<ID>) | .phoneNumber"
Run Code Online (Sandbox Code Playgroud)

每次一次<ID>并将结果与​​后续工作粘合在一起;,这非常慢,因为它必须为每个ID(以及我想要提取的其他字段)重新加载文件.

在单个查询中连接它:

 cat persons.txt | jq "(.persons[] | select(.personID==11111) | .phoneNumber), (.persons[] | select(.personID==22222) | .phoneNumber), (.persons[] | select(.personID==33333) | .phoneNumber), (.persons[] | select(.personID==44444) | .phoneNumber), (.persons[] | select(.personID==55555) | .phoneNumber)"
Run Code Online (Sandbox Code Playgroud)

这也有效,但它给出了

123456
432100
147258
Run Code Online (Sandbox Code Playgroud)

所以我不知道哪些字段丢失了,有多少字段;要插入.

pea*_*eak 3

使用 input.json 中的示例输入并使用 jq 1.6(或带有 INDEX/2 的 jq),以下 jq 调用会产生所需的输出:

jq -r --argjson ids '[11111, 22222, 33333, 44444, 55555]' -f tossv.jq input.json 
Run Code Online (Sandbox Code Playgroud)

假设 tossv.jq 包含程序:

INDEX(.persons[]; .personID) as $dict
| $ids
| map( $dict[tostring] | .phoneNumber)
| join(";")
Run Code Online (Sandbox Code Playgroud)

程序说明

  1. INDEX/2 生成一个充当字典的 JSON 对象。由于 JSON 键必须是字符串,因此tostring必须在上面的第 3 行中使用。

  2. 使用时join(";")null值实际上变成空字符串。

  3. 如果您的 jq 没有 INDEX/2,那么现在可能是升级的好时机。否则你可以通过谷歌搜索来获取它的定义:jq "def INDEX" builtin.jq