小编ray*_*ght的帖子

如何使用 jq 在 JSON 中排除具有特定值的所有键?

假设我有一个如下所示的 JSON:

{
    "key1": {
        "keyA": "1",
        "keyB": "null",
        "keyC": "null"
    },
    "key2": {
        "keyA": "null",
        "keyB": "3",
        "keyC": "null"
    }
}
Run Code Online (Sandbox Code Playgroud)

我想找到一种方法来排除所有具有nullJSON值的键。所以结果如下:

{
    "key1": {
        "keyA": "1"
    },
    "key2": {
        "keyB": "3"
    }
}
Run Code Online (Sandbox Code Playgroud)

我知道我可以使用它们的名字排除特定的键jq,例如cat myjson.json | jq 'del(.[]|.keyA)',这将删除我keyA在 json 中的所有键,但我想根据它们的值排除这些键......如何"null"使用排除所有具有值的键jq

jq

4
推荐指数
1
解决办法
1048
查看次数

是否可以使用 with_entries 方法通过 jq 递归地更改键名称?

假设我有以下 JSON 文件:

[
  {
    "name1": "fruits",
    "name2": "cars",
    "name3": "houses"
  }
]
Run Code Online (Sandbox Code Playgroud)

我知道我可以用于jq重命名其值,如下所示:

jq '[.[] | .["newname1"] = .name1 | del(.name1)]' file
Run Code Online (Sandbox Code Playgroud)

这工作正常,它允许我甚至在更复杂的 JSON 结构上进行更改...但是,这是我想要更改的键的非常明确的声明。执行相同操作的另一种方法是使用以下命令:

jq 'map(with_entries(if .key == "name1" then .key = "newname1" else . end))' file 
Run Code Online (Sandbox Code Playgroud)

这是一种检查 JSON(对象数组)内具有特定名称的所有键并更改它们的方法。在这种情况下,我不需要显式声明 的名称key。但是,这仅适用于对象数组。我想找到一种以递归方式更改 json 内所有键的方法。假设我有一个如下所示的 JSON:

{
  "name1": "one",
  "type": "FeatureCollection",
  "features": [
    {
      "name1": "one",
      "valueA": "0",
      "valueB": "0",
      "keyB": "2",
      "keyC": "3"
    },
    {
      "name1": "two",
      "valueA": "11",
      "valueB": "21",
      "keyB": "15",
      "keyC": "20"
    } …
Run Code Online (Sandbox Code Playgroud)

jq

2
推荐指数
1
解决办法
4450
查看次数

当 FS 已在使用时,如何使用 awk 分割字符串?

假设我有file.csv以下内容:

id;filename;device
1;118574934-20220503-17h44m20s101;
2;118574934-20220503-17h44m20s101;
3;118574934-20220503-17h44m20s101;DEVICE-0001-33
4;118574934-20220503-17h44m20s101;DEVICE-0001-33
5;118574934-20220503-17h44m20s101;DEVICE-0001-33
6;118574934-20220503-17h44m20s101;DEVICE-0001-33
7;118574934-20220503-17h44m20s101;DEVICE-0001-33
Run Code Online (Sandbox Code Playgroud)

我创建了一个awk脚本,用于在设备名称出现在我的文件中时处理获取设备名称,然后完成执行。它script.awk的功能如下:

id;filename;device
1;118574934-20220503-17h44m20s101;
2;118574934-20220503-17h44m20s101;
3;118574934-20220503-17h44m20s101;DEVICE-0001-33
4;118574934-20220503-17h44m20s101;DEVICE-0001-33
5;118574934-20220503-17h44m20s101;DEVICE-0001-33
6;118574934-20220503-17h44m20s101;DEVICE-0001-33
7;118574934-20220503-17h44m20s101;DEVICE-0001-33
Run Code Online (Sandbox Code Playgroud)

其执行后的输出awk -f script.awk file.csv为:

filename;folder
DEVICE-0001-33_118574934-20220503-17h44m20s101.txt;DEVICE-0001-33
Run Code Online (Sandbox Code Playgroud)

问题是我想将字符串拆分DEVICE-0001-33DEVICE-0001. 因为我已经使用了FSwith;并且我不能FS再次使用 as-来分割我的device变量。我怎样才能仅使用来处理这个问题awkFS一旦已经使用,如何将变量与特定字符分开?

awk

1
推荐指数
1
解决办法
376
查看次数

标签 统计

jq ×2

awk ×1