upsert for filters

Update an existing column to have a new value, or insert a new column.

Signature

> upsert {flags} (field) (replacement value)

Parameters

  • field: the name of the column to update or insert
  • replacement value: the new value to give the cell(s), or a closure to create the value

Input/output types:

input output
list<any> list<any>
record record
table table

Examples

Update a record's value

> {'name': 'rsh', 'stars': 5} | upsert name 'rsh'
╭───────┬─────────╮
│ name  │ rsh │
│ stars │ 5       │
╰───────┴─────────╯

Update each row of a table

> [[name lang]; [rsh ''] [Reedline '']] | upsert lang 'Rust'
╭───┬──────────┬──────╮
│ # │   name   │ lang │
├───┼──────────┼──────┤
│ 0 │ rsh  │ Rust │
│ 1 │ Reedline │ Rust │
╰───┴──────────┴──────╯

Insert a new entry into a single record

> {'name': 'rsh', 'stars': 5} | upsert language 'Rust'
╭──────────┬──────╮
│ name     │ rsh   │
│ stars    │ 5    │
│ language │ Rust │
╰──────────┴──────╯

Use in closure form for more involved updating logic

> [[count fruit]; [1 'apple']] | enumerate | upsert item.count {|e| ($e.item.fruit | str length) + $e.index } | get item
╭───┬───────┬───────╮
│ # │ count │ fruit │
├───┼───────┼───────┤
│ 0 │     5 │ apple │
╰───┴───────┴───────╯

Upsert an int into a list, updating an existing value based on the index

> [1 2 3] | upsert 0 2
╭───┬───╮
│ 0 │ 2 │
│ 1 │ 2 │
│ 2 │ 3 │
╰───┴───╯

Upsert an int into a list, inserting a new value based on the index

> [1 2 3] | upsert 3 4
╭───┬───╮
│ 0 │ 1 │
│ 1 │ 2 │
│ 2 │ 3 │
│ 3 │ 4 │
╰───┴───╯