【问题标题】:How to get the content of a JSON without showing the names of the key values如何在不显示键值名称的情况下获取 JSON 的内容
【发布时间】:2021-10-24 06:41:03
【问题描述】:

我是 Bash 新手,我目前正在尝试获取 JSON 的内容而不显示键值的名称。

这是 JSON 的样子(部分):

[
  {
    "V1": 65,
    "V2": "Female",
    "V3": 0.7,
    "V4": 0.1,
    "V5": 187,
    "V6": 16,
    "V7": 18,
    "V8": 6.8,
    "V9": 3.3,
    "V10": 0.9,
    "Class": 1
  },
  {
    "V1": 62,
    "V2": "Male",
    "V3": 10.9,
    "V4": 5.5,
    "V5": 699,
    "V6": 64,
    "V7": 100,
    "V8": 7.5,
    "V9": 3.2,
    "V10": 0.74,
    "Class": 1
  },
  {
    "V1": 62,
    "V2": "Male",
    "V3": 7.3,
    "V4": 4.1,
    "V5": 490,
    "V6": 60,
    "V7": 68,
    "V8": 7,
    "V9": 3.3,
    "V10": 0.89,
    "Class": 1
  }
]

这是我的脚本

#!/bin/bash

echo "Albumin =3";
echo "Age Sex Albumin  Proteins";
echo "******";
echo " "
echo "Women";
echo "--------------";
cat csvjson.json | jq -c '.[] | {V1, V2, V8, V9} | select(.V9 ==3) | select(.V2 =="Female")';
echo " "
echo "Men";
echo "-------------";
cat csvjson.json | jq -c '.[] | {V1, V2, V8, V9} | select(.V9 ==3) | select(.V2 =="Male")';

这就是脚本显示的内容

Women
--------------
{"V1":38,"V2":"Female","V8":5.6,"V9":3}
{"V1":38,"V2":"Female","V8":5.6,"V9":3}
{"V1":32,"V2":"Female","V8":6,"V9":3}
{"V1":31,"V2":"Female","V8":6,"V9":3}
{"V1":19,"V2":"Female","V8":5.5,"V9":3}
{"V1":38,"V2":"Female","V8":7,"V9":3}
{"V1":20,"V2":"Female","V8":6.1,"V9":3}
{"V1":32,"V2":"Female","V8":7,"V9":3}
{"V1":42,"V2":"Female","V8":6.7,"V9":3}
 
Men
-------------
{"V1":72,"V2":"Male","V8":7.4,"V9":3}
{"V1":60,"V2":"Male","V8":6.3,"V9":3}
{"V1":33,"V2":"Male","V8":5.4,"V9":3}
{"V1":60,"V2":"Male","V8":6.8,"V9":3}
{"V1":60,"V2":"Male","V8":7.4,"V9":3}
{"V1":60,"V2":"Male","V8":7,"V9":3}
{"V1":72,"V2":"Male","V8":6.2,"V9":3}

这就是我想要展示的

Women
--------------
38,Female,3, 5.6
38,Female,3, 5.6
32,Female,3, 6
31,Female,3, 6
19,Female,3, 5.5
38,Female,3, 7
20,Female,3, 6.1
32,Female,3, 7
42,Female,3, 6.7

Men
--------------
72,Male,3, 7.4
60,Male,3, 6.3
33,Male,3, 5.4
60,Male,3, 6.8
60,Male,3, 7.4
60,Male,3, 7
72,Male,3, 6.2

那么,我怎样才能隐藏键值,只在我做的过滤器后显示 JSON 的内容呢?

【问题讨论】:

  • @Cyrus csvjson.json是 json 文件的名称,它可以正常工作。我不认为这是问题,对不起。我只是展示它的外观,但只是我提到的一部分。我误会你了吗?
  • 您要打印所有行还是只打印与.V9 == 3匹配的行?
  • @pmf 所有符合条件的行:.V9 == 3, .V2 ="Female" 并显示 .V1, .V2, .V3 ,.V9,如“我的脚本”中所示显示...'
  • 只是问,因为您所有的示例数据在.V9 字段中都有3.3(不是3),所以不会显示,对吧?还是要打印 3 而不是实际的 .V9 值?
  • @pmf 我不这么认为。所有 .V9 值都等于 3。 --> {"V1":38,"V2":"Female","V8":5.6,"V9":3} {"V1":38,"V2":"Female","V8":5.6,"V9":3} {"V1":32,"V2":"Female","V8":6,"V9":3} {"V1":31,"V2":"Female","V8":6,"V9":3}

标签: bash jq


【解决方案1】:

这完全可以在jq内完成(虽然有些限制不是很清楚,所以请评论,我会更新代码):

jq --raw-output '

  group_by(.V2)[]
  | if first.V2 == "Male" then "Men" else "Women" end,
    "--------------",
    (
      .[]
      | select(.V9 == 3.3)    # this filters to matching records
      | [.V1, .V2, .V9, .V8]
      | join(",")
    )

' csvjson.json

Demo

【讨论】:

  • 不幸的是,这给出了以下结果:{ "V1": 38, "V2": "Female", "V8": 5.6, "V9": 3 } { "V1": 38, "V2": "Female", "V8": 5.6, "V9": 3 } 但与您所看到的预期结果不同
  • 您正在处理问题中提供的其他数据。上面的示例数据(在“这是 json 的样子”下)不包含任何记录,.v9 等于 3。此外,我的代码最终会生成字符串(由于 --raw-output 选项),而不是带有字段的对象。试试我提供的演示,修改它,然后将您的链接作为响应发布。
  • 更新了过滤匹配记录的代码。
  • 你知道你可以用#!/usr/bin/env -S jq --raw-output --from-file的shebang制作一个独立的jq脚本,如果你指定jq作为代码块语言,你的代码块甚至有语法高亮显示?
  • (而且 afaik SO 的 markdown 没有 jq 支持。)
【解决方案2】:

演示独立的jq 脚本和代码块语言突出显示,用于使用pmf 的答案在堆栈站点中使用。

#!/usr/bin/env -S jq --raw-output --from-file

group_by(.V2)[]
| if first.V2 == "Male" then "Men" else "Women" end,
  "--------------",
  (
    .[]
    | select(.V9 == 3.3)    # this filters to matching records
    | [.V1, .V2, .V9, .V8]
    | join(",")
  )

【讨论】:

    猜你喜欢
    • 2015-07-12
    • 1970-01-01
    • 2015-01-23
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多