如何使用 jq 和自定义压缩函数压缩数组

问题描述 投票:0回答:3

我有这个数据:

[
  [
    "USER",
    "TTY",
    "FROM",
    "LOGIN@",
    "IDLE",
    "JCPU",
    "PCPU",
    "WHAT"
  ],
  [
    "lava1",
    "pts/0",
    "157.48.149.102",
    "05:03",
    "31.00s",
    "0.31s",
    "0.31s",
    "-bash"
  ],
  [
    "azureuse",
    "pts/1",
    "157.48.149.102",
    "07:26",
    "0.00s",
    "0.07s",
    "0.05s",
    "w"
  ]
]

我想要这样:

[
  { 
     "USER": "lava1",
     "TTY": "pts/0"
  },
  { 
     "USER": "azureuse",
     "TTY": "pts/1"
  }
]

等等,对于所有 K/V 对。 所以基本上

map {(.[0][..]) : [:1][..]})
- 我想在
.[0]
中的一个条目和其余
[:..]

中的相应条目之间创建一个映射

绝对无效的语法,但我正在思考如何做到这一点

jq
3个回答
0
投票

我想这就是你要找的

jq '.[0] as $cols 
| .[1:] 
| map(. as $row 
  | $cols   
  | with_entries({ "key": .value,"value": $row[.key]}) 
)' 

结果:

[
  {
    "USER": "lava1",
    "TTY": "pts/0",
    "FROM": "157.48.149.102",
    "LOGIN@": "05:03",
    "IDLE": "31.00s",
    "JCPU": "0.31s",
    "PCPU": "0.31s",
    "WHAT": "-bash"
  },
  {
    "USER": "azureuse",
    "TTY": "pts/1",
    "FROM": "157.48.149.102",
    "LOGIN@": "07:26",
    "IDLE": "0.00s",
    "JCPU": "0.07s",
    "PCPU": "0.05s",
    "WHAT": "w"
  }
]

阅读更多: https://github.com/stedolan/jq/wiki/Cookbook#zip-column-headers-with-their-rows


0
投票

试试这个:

jq '.[0] as [$user, $tty] | .[1:] | map({$user:.[0], $tty:.[1]})' input.json

或者如果你想选择你想要的列:

jq '.[0] as $title
  | [0, 1] as $cols # Pick the first and second columns
  | .[1:] | map(. as $v
              | reduce $cols[] as $i ({}; .[$title[$i]]=$v[$i]))' 

-2
投票

你可以尝试这样的事情:

function customZip(array1, array2) {
  var zipped = [];
  for (var i = 0; i < Math.min(array1.length, array2.length); i++) {
    zipped.push([array1[i], array2[i]]);
  }
  return zipped;
}

关键是你需要迭代抛出 2 数组的最小长度

用法:

var array1 = [1, 2, 3];
var array2 = ['a', 'b', 'c'];
var zippedArray = customZip(array1, array2);

console.log(zippedArray); // Output: [[1, 'a'], [2, 'b'], [3, 'c']]
© www.soinside.com 2019 - 2024. All rights reserved.