group-by for filters

Splits a list or table into groups, and returns a record containing those groups.

Signature

> group-by {flags} (grouper)

Flags

  • --to-table, -: Return a table with "groups" and "items" columns

Parameters

  • grouper: The path to the column to group on.

Input/output types:

inputoutput
list<any>any

Examples

Group items by the "type" column's values

> ls | group-by type

Group items by the "foo" column's values, ignoring records without a "foo" column

> open cool.json | group-by foo?

Group using a block which is evaluated against each input value

> [foo.txt bar.csv baz.txt] | group-by { path parse | get extension }
╭─────┬─────────────────╮
 ╭───┬─────────╮
 txt 0 foo.txt
 1 baz.txt
 ╰───┴─────────╯
 ╭───┬─────────╮
 csv 0 bar.csv
 ╰───┴─────────╯
╰─────┴─────────────────╯

You can also group by raw values by leaving out the argument

> ['1' '3' '1' '3' '2' '1' '1'] | group-by
╭───┬───────────╮
 ╭───┬───╮
 1 0 1
 1 1
 2 1
 3 1
 ╰───┴───╯
 ╭───┬───╮
 3 0 3
 1 3
 ╰───┴───╯
 ╭───┬───╮
 2 0 2
 ╰───┴───╯
╰───┴───────────╯

You can also output a table instead of a record

> ['1' '3' '1' '3' '2' '1' '1'] | group-by --to-table
╭───┬───────┬───────────╮
 # │ group │   items   │
├───┼───────┼───────────┤
 0 1 ╭───┬───╮
 0 1
 1 1
 2 1
 3 1
 ╰───┴───╯
 1 3 ╭───┬───╮
 0 3
 1 3
 ╰───┴───╯
 2 2 ╭───┬───╮
 0 2
 ╰───┴───╯
╰───┴───────┴───────────╯