テキストを整形する

INPUT · スライド

横に並べる、行番号を振る(`paste` と `nl`)

01 / 06

今度は「横」につなぐ

ここまでの道具を思い出してみて。

  • grep … 要るを選ぶ(横に切る)
  • cut … 要るを抜く(縦に切る)
  • sortuniq … 行を並べかえる、まとめる

どれも減らす・並べかえる道具だったね。

この回は逆向きだよ。別々のファイルを横につなぐ paste と、行番号を足す nl を扱うんだ。減らすのではなく、増やす向きの道具だよ。

02 / 06

`paste` は行どうしを横につなぐ

paste は2つ以上のファイルを、同じ行番号どうしで横に並べるよ。

```
~ $ paste namae.txt tensuu.txt
tanaka 80
suzuki 95
sato 72
```

名前のファイルと点数のファイルが、1行ずつ組になったね。

区切りはタブが既定だよ。-d で変えられるので、CSV を作りたいならこうだね。

```
paste -d, namae.txt tensuu.txt
```

cat namae.txt tensuu.txt だと縦に6行つながってしまうのを思い出して。cat は縦、paste は横だよ。

~ $ paste -d, namae.txt tensuu.txttanaka,80suzuki,95sato,72

03 / 06

`-s` で縦を横にする

-s(serial)を付けると、1つのファイルの全部の行を1行にまとめるよ。

```
~ $ paste -s -d, namae.txt
tanaka,suzuki,sato
```

縦に並んでいたものが横1行になったね。

前のレッスンで tr を使って「横のものを縦にした」よね。paste -s はその逆向きだよ。

| やりたいこと | 道具 |
| --- | --- |
| 横 → 縦 | tr ' ' '\n' |
| 縦 → 横 | paste -s -d' ' |

この2つを覚えておくと、データの向きを自由に変えられるようになるよ。

04 / 06

`nl` で行番号を振る

nl(number lines)は各行の頭に行番号を付けるよ。

```
nl namae.txt
```

番号の幅や区切りは変えられるよ。既定だと右そろえで見にくいので、こう書くと読みやすいんだ。

```
nl -w1 -s': ' namae.txt
```

  • -w1 … 番号の幅を1桁分に(余分な空白を入れない)
  • -s': ' … 番号のあとに : を置く

他にも -v10 で10番から始めたり、-i5 で5ずつ増やしたりできるよ。

~ $ nl -w1 -s': ' namae.txt1: tanaka2: suzuki3: sato

05 / 06

`nl` と `cat -n` の違い

行番号を振る方法はもう1つあるよ。cat -n だね。でも結果が違うんだ

kara.txtaaa・空行・bbb の3行だよ。

```
~ $ nl kara.txt
1 aaa
2 bbb

~ $ cat -n kara.txt
1 aaa
2
3 bbb
```

nl は空行を数えないんだ。cat -n は数えるよ。

どちらが欲しいかは場面によるね。

  • 文章に番号を振る(空行は飾りなので数えたくない) → nl
  • ファイルの何行目かを知りたい(実際の行番号が欲しい) → cat -n

nl -ba と書けば nl でも空行を数えるようになるよ(b は body、a は all だね)。

06 / 06

さあ、打ってみよう

ファイルは3つだよ。

  • namae.txttanakasuzukisato
  • tensuu.txt809572
  • kara.txtaaa・空行・bbb

namae.txttensuu.txt行の順番が対応しているよ。1行目どうし(tanaka80)が組だね。

paste は行の順番だけを見て組にするので、順番が合っていないと間違った組ができる。使う前に両方のファイルを cat で見て、順番が合っているか確かめる癖をつけてね。