So far, we've worked with tables by trimming the table down to only what we need. Sometimes we may want to go a step further and only look at the values in the cells themselves rather than taking a whole column. Let's say, for example, we wanted to only get a list of the names of the files. For this, we use the [`get`](/commands/docs/get.md) command:
```nu
ls | get name
# => ───┬───────────────
# => 0 │ files.rs
# => 1 │ lib.rs
# => 2 │ lite_parse.rs
# => 3 │ parse.rs
# => 4 │ path.rs
# => 5 │ shapes.rs
# => 6 │ signature.rs
# => ───┴───────────────
```
We now have the values for each of the filenames.
This might look like the [`select`](/commands/docs/select.md) command we saw earlier, so let's put that here as well to compare the two:
```nu
ls | select name
# => ───┬───────────────
# => # │ name
# => ───┼───────────────
# => 0 │ files.rs
# => 1 │ lib.rs
# => 2 │ lite_parse.rs
# => 3 │ parse.rs
# => 4 │ path.rs
# => 5 │ shapes.rs
# => 6 │ signature.rs
# => ───┴───────────────
```
These look very similar! Let's see if we can spell out the difference between these two commands to make it clear:
- [`select`](/commands/docs/select.md) - creates a new table which includes only the columns specified
- [`get`](/commands/docs/get.md) - returns the values inside the column specified as a list
:::tip
The arguments provided to `select` and `get` are [cell-paths](/book/types_of_data.html#cell-paths), a fundamental part of Nu's query language. For a more in-depth discussion of cell-paths and other navigation topics, see the next chapter, [Navigating and Accessing Structured Data](/book/navigating_structured_data.md).
:::
## Changing Data in a Table
In addition to selecting data from a table, we can also update what the table has. We may want to combine tables, add new columns, or edit the contents of a cell. In Nu, rather than editing in place, each of the commands in the section will return a new table in the pipeline.
### Concatenating Tables
We can concatenate tables using [`append`](/commands/docs/append.md):
```nu
let first = [[a b]; [1 2]]
let second = [[a b]; [3 4]]
$first | append $second
# => ───┬───┬───
# => # │ a │ b
# => ───┼───┼───
# => 0 │ 1 │ 2
# => 1 │ 3 │ 4
# => ───┴───┴───
```
If the column names are not identical then additionally columns and values will be created as necessary:
```nu
let first = [[a b]; [1 2]]
let second = [[a b]; [3 4]]
let third = [[a c]; [3 4]]
$first | append $second | append $third
# => ───┬───┬────┬────
# => # │ a │ b │ c
# => ───┼───┼────┼────
# => 0 │ 1 │ 2 │ ❎
# => 1 │ 3 │ 4 │ ❎
# => 2 │ 3 │ ❎ │ 4
# => ───┴───┴────┴────
```
You can also use the `++` operator as an inline replacement for `append`:
```nu
$first ++ $second ++ $third
# => ───┬───┬────┬────
# => # │ a │ b │ c
# => ───┼───┼────┼────
# => 0 │ 1 │ 2 │ ❎
# => 1 │ 3 │ 4 │ ❎
# => 2 │ 3 │ ❎ │ 4
# => ───┴───┴────┴───
```
### Merging Tables
We can use the [`merge`](/commands/docs/merge.md) command to merge two (or more) tables together
```nu
let first = [[a b]; [1 2]]
let second = [[c d]; [3 4]]
$first | merge $second
# => ───┬───┬───┬───┬───
# => # │ a │ b │ c │ d
# => ───┼───┼───┼───┼───
# => 0 │ 1 │ 2 │ 3 │ 4
# => ───┴───┴───┴───┴───
```
Let's add a third table:
```nu
let third = [[e f]; [5 6]]
```
We could join all three tables together like this:
```nu
$first | merge $second | merge $third
# => ───┬───┬───┬───┬───┬───┬───
# => # │ a │ b │ c │ d │ e │ f
# => ───┼───┼───┼───┼───┼───┼───
# => 0 │ 1 │ 2 │ 3 │ 4 │ 5 │ 6
# => ───┴───┴───┴───┴───┴───┴───
```
Or we could use the [`reduce`](/commands/docs/reduce.md) command to dynamically merge all tables:
```nu
[$first $second $third] | reduce {|elt, acc| $acc | merge $elt }
# => ───┬───┬───┬───┬───┬───┬───
# => # │ a │ b │ c │ d │ e │ f
# => ───┼───┼───┼───┼───┼───┼───
# => 0 │ 1 │ 2 │ 3 │ 4 │ 5 │ 6
# => ───┴───┴───┴───┴───┴───┴───
```
### Adding a new Column
We can use the [`insert`](/commands/docs/insert.md) command to add a new column to the table. Let's look at an example: