テキストを整形する

INPUT · スライド

並べかえる(`sort`)

01 / 08

この章は「つなぐ相手」を増やす回

前の章でパイプを覚えたね。つなぎ方は分かったので、つなぐ相手を増やしていくよ。

この章の道具はどれも同じ形をしているよ。

テキストを受け取って、加工して、テキストを返す

だから全部パイプでつながるんだ。並べる道具、重なりを消す道具、列を抜く道具……それを組み合わせると、表計算ソフトでやるような集計が1行で書けるようになるよ。

最初は sort並べかえる道具だよ。

02 / 08

`sort` は行を並べかえる

使い方はいちばん簡単な形だよ。

```
sort namae.txt
```

これで行がアルファベット順に並ぶ。元のファイルは変わらないよ。並べた結果を出すだけだね。

残したいなら > を足す。前の章でやったとおりだよ。

```
sort namae.txt > narabeta.txt
```

~ $ sort namae.txtsatosuzukitanaka

03 / 08

数はそのままでは並ばない

ここでいちばん大事な落とし穴を先に見せるよ。数を sort すると変な順になるんだ。

```
~ $ sort tensuu.txt
100
25
3
9
```

100 がいちばん上、39 より先。おかしいよね。

理由は sort文字として比べているからだよ。1文字目を見て 1 < 2 < 3 < 9 の順に並べている。100 の 1 と 25 の 2 を比べているだけなんだ。

電話帳と同じ考え方だね。「あきら」より「あい」が先に来るのと同じ理屈だよ。

04 / 08

`-n` で数として並べる

数として並べたいときは -n を付けるよ(number の n)。

```
~ $ sort -n tensuu.txt
3
9
25
100
```

これで思った通りになったね。

数が入っているものを並べるときは -n。これは忘れると必ず間違うので、体で覚えてしまおう。ログの集計で sort -rn を使ったのを覚えているかな。あの n がこれだよ。

05 / 08

列を指定して並べる

表のようなデータでは、何列目で並べるかを決めたいよね。

```
sort -t, -k2 -n seiseki.csv
```

  • -t, … 区切りは ,(カンマ)
  • -k2 … 2列目を見て並べる
  • -n … 数として

seiseki.csv名前,点数 の形なので、これで点数順に並ぶんだ。

-t を書かないと、区切りは空白になるよ。空白区切りのデータなら -k2 だけでいいんだ。

~ $ sort -t, -k2 -n seiseki.csvsato,72tanaka,80kimura,95suzuki,95

06 / 08

重なりを消す `-u`

-u(unique)を付けると、同じ行を1つにまとめて並べてくれるよ。

```
sort -u kudamono.txt
```

次のレッスンでやる uniq と同じことができるけれど、sort -u は1つで済むので短いよ。

ただし uniq にしかできないこともあるんだ(個数を数える -c など)。だから両方覚えるよ。

07 / 08

大文字と小文字の順

sort は既定では大文字を小文字より先に並べるよ。AppleBananaapple の順だね。

意外に感じるけれど、これは文字コードの番号順に並べているからだよ。コンピュータの中では A(65) が a(97) より小さいんだ。

人が期待する順(AppleappleBanana)にしたいときは -f を付けるよ(fold = 大小を畳む)。

人向けの一覧を作るときは -f。覚えておくと親切な出力が作れるよ。

08 / 08

さあ、打ってみよう

ファイルは5つあるよ。

  • namae.txt … 名前が3行
  • tensuu.txt100 9 25 3 の4行
  • seiseki.csv名前,点数 が4行
  • kudamono.txt … 果物が6行(重なりあり)
  • oomoji.txtApple apple Banana

この回では並んだ順を確かめるために、| head -1(いちばん上)や | tail -1(いちばん下)をよく使うよ。並びが正しいかは、端を見るのがいちばん早いんだ。