使用 awk 或 jq 获取 json 值

Dav*_*Boe -3 awk json jq

我的 json 文件看起来像这样。

我有超过 5000 个文件:文件名:xxxx.json

示例文件1000.json

[
  {
    "gender": {
      "value": "Female"
    },
    "age": 38.58685,
    "age_group": "adult"
  },
  {
    "gender": {
      "value": "Male"
    },
    "age": 26.64953,
    "age_group": "adult"
  }
]
Run Code Online (Sandbox Code Playgroud)

示例文件2000.json

[
  {
    "gender": {
      "value": "Male"
    },
    "age": 63.8272,
    "age_group": "adult"
  },
  {
    "gender": {
      "value": "Male"
    },
    "age": 11.8287,
    "age_group": "child"
  }
]
Run Code Online (Sandbox Code Playgroud)

一个文件output.txt 中的所需输出

1000 & Female,Male & 38,26 & adult,adult
2000 & Male,Male & 63,11 & adult,child

Sha*_*awn 5

它可以jq通过一些字符串插值来实现:

$ find . -name "*.json" -exec jq -r \
  '(input_filename | gsub("^\\./|\\.json$";"")) as $fname |
   (map(.gender.value) | unique | join(",")) as $genders |
   (map(.age|floor|tostring) | join(",")) as $ages |
   (map(.age_group) | unique | join(",")) as $age_groups |
   "\($fname) & \($genders) & \($ages) & \($age_groups)"' '{}' +
1000 & Female,Male & 38,26 & adult
2000 & Male & 63,11 & adult,child
Run Code Online (Sandbox Code Playgroud)

input_filename命令返回明显的,对于其他部分,只需从.数组中获取所需的字段并将它们连接到 CSV 字符串中(使用join而不是@csv避免添加引号)。


这些find东西是为了避免jq -r '...' *.json命令行太长的可能性,因为你说你有超过 5000 个文件。它jq可能会运行多次,每次使用尽可能多的文件名(尾随+而不是;使-exec工作很像xargs),而不是每个文件运行一次,以提高效率。