jq:无法使用字符串“id”索引数组

ilo*_*ejq 3 arrays shell json jq

我的backup.json看起来像这样:

{
  "andres": [
    [
      {
        "id": 1,
        "email": "password",
        "username": test1,
        "password": "email@email.com",
        "name": "Dummy Account",
        "address": "123 st road",,
        "ip_address": "0.0.0.0",
        "phone": "123-123-1234",
      },
      {
        "id": 2,
        "email": "email2@email.com",
        "username": test2,
        "password": "password",
        "name": "Dummy Account",
        "address": "123 st road",,
        "ip_address": "0.0.0.0",
        "phone": "123-123-1234"
      }
    ],
  ]
}
Run Code Online (Sandbox Code Playgroud)

我正在使用命令:

jq -r '.andres[] | .id, .email, .username, .password, .name, .address, .ip_address, .phone' < backup.json > backup.csv
Run Code Online (Sandbox Code Playgroud)

但它给出了错误:

Cannot index array with string "id"
Run Code Online (Sandbox Code Playgroud)

我希望它看起来像这样:

1,email@email.com,test1,password,Dummy Account,123 st road,0.0.0.0,123-123-1234
2,email@email.com,test2,password,Dummy Account,123 st road,0.0.0.0,123-123-1234
Run Code Online (Sandbox Code Playgroud)

我刚开始使用 JQ。有人可以修复我的命令并告诉我哪里出错了吗?

谢谢!

Jef*_*ado 7

json 中的值andres是一个数组数组,但您访问它就像它是一个对象数组一样。您必须首先展平数组(或索引)才能访问对象。然后,您需要从这些对象中将所需的 csv 值映射为值数组。

$ jq -r '
.andres[][] | [.id, .email, .username, .password, .name, .address, .ip_address, .phone] | @csv
' < backup.json > backup.csv
Run Code Online (Sandbox Code Playgroud)

[]请注意中的第二组.andres[][]

您可能还想在输出中添加一些标头。

$ jq -r '
["id", "email", "username", "password", "name", "address", "ip_address", "phone"] as $headers
    | $headers, (.andres[][] | [.[$headers[]]]) | @csv
' < backup.json > backup.csv
Run Code Online (Sandbox Code Playgroud)


gle*_*man 5

是一个有趣的野兽。我发现这需要大量的尝试和错误。

修复 JSON 后

$ jq -r '.andres[][] | map(values) | @csv' file.json
1,"password","test1","email@email.com","Dummy Account","123 st road","0.0.0.0","123-123-1234"
2,"email2@email.com","test2","password","Dummy Account","123 st road","0.0.0.0","123-123-1234"
Run Code Online (Sandbox Code Playgroud)

请注意,对于 id=1,您已切换密码和电子邮件值。

另请参阅jq 手册中的“格式化字符串和转义”