【Linuxコマンド】grep/awk/sortコマンドでプチデータ分析

# はじめに

こちらは、
`KPI 項目A：「ターミナル・コマンドに慣れる」項目A：「ターミナル・コマンドに慣れる」`
のアウトプット記事です。

# 本編
今回はgrep awk sortを活用して、Linuxサーバ上でデータ処理を行いました。

## 準備
今回は検索及びテキスト処理を行うため、下記からサンプル用のCSVを取得しました。
公的統計を地域別にまとめてくれているのデータセットとのことです。
今回はヘッダー部分を削除してデータ部分のみを抽出し、Linuxサーバ上へ配置しました。

* [SSDSE-2019A（CSV形式：949KB）](https://www.nstac.go.jp/SSDSE/)

データ形式は下記のとおり。

|地域コード|都道府県|市区町村|総人口|123個(中略)|保育所等在所児数|
|-----|-----|-----|----|----|----|
|R01100|北海道|札幌市|1952356|・・・|25742|

中略部分は適宜、下記の解説を参照します。

* [SSDSEの解説（PDF：908KB）](https://www.nstac.go.jp/SSDSE/data/kaisetsu-2019.pdf)

## 指定した都道府県データのみを抽出
ある都道府県のデータ(行)のみを抽出したい場合は、grepコマンドを用います。
Grepコマンドは、指定した文字列またはパターンが含まれている**行**を表示するコマンドです。

"和歌山県"のデータのみをデータ抽出してみます。

```sh
# grep "検索する文字列" ファイル
grep "和歌山県" data/ssdse-2019a.csv

[test@srv1 testAwk]$ grep "和歌山県" data/ssdse-2019a.csv
R30201 和歌山県 和歌山市 364154 171215 192939 360592 169798 190794 44519 22757 21762 211753 102859 108894 105954 44446 61508 50822 19092 31730 2466 2727 4449 7627 7938 153089 152798 355502 91995 48369 37387 20594 22322 1819 727 20884 14726 16947 13 1228 1399 19 141 367 4438 339 1333 658 1751 1435 618 1554 108 1378 159 21 2628 14298 177281 326 10259 25874 1139 2240 11469 34092 5855 4467 4079 15176 6481 10411 25096 882 11457 7907 392 36138 140751 2173 1478 95.6 11.6 152643733 63453773 151658392 65642801 20551722 13750658 0 28 3665 54 1131 17614 25 688 10313 14 12329 162655 90595 72060 8131 5266 2865 132002 43765 88237 3023 37094 114600 1 2 373593 43481 3094 1519 55 34 443 235 1616 335 1172 58 6830
(以下省略)
```

## 一部のデータだけを抽出する

前で実行したコマンドをリダイレクトで使います。
今回は、転出者と転入者の情報から転入割合を求めてみます。

転出者と転入者の情報（2017年度）のみを抽出したいので、awkコマンドを用います。
awkコマンドは、指定の区切り文字で分割したデータを整形するコマンドです。

デフォルトは空白(" ")を区切り文字として分割します。
出力時は、"{print $1}"のように特定の項目を指定して出力可能です。

今回は出力する情報は転入者数，転出者数，転入者数－転出者数の3項目としました。
3つ目の出力では差分の計算結果を出力しています。

|出力番号|データ列番号|項目名または数式|備考|
|----|------|------|----|
|1|3|市町村名||
|2|25|転入者数||
|3|26|転出者数||
|4|-|転入者数-転出者数|正数：転出者数以上の転入者数<br/>負数：転入者数以上の転出者数|

```sh
# awk -F'[区切り文字(複数可)]' '{awkコマンド}' file
[test@srv1 testAwk]$ grep "和歌山県" data/ssdse-2019a.csv | awk '{print $3,$25,$26,$25-$26}'
和歌山市 7627 7938 -311
海南市 1042 1324 -282
橋本市 1260 1560 -300
有田市 469 713 -244
御坊市 632 787 -155
田辺市 1691 2216 -525
新宮市 815 1068 -253
紀の川市 1278 1689 -411
岩出市 1720 1753 -33
紀美野町 154 225 -71
かつらぎ町 360 430 -70
九度山町 91 112 -21
高野町 88 168 -80
湯浅町 223 313 -90
広川町 142 202 -60
有田川町 611 593 18
美浜町 275 289 -14
日高町 260 239 21
由良町 99 169 -70
印南町 157 204 -47
みなべ町 196 345 -149
日高川町 270 289 -19
白浜町 691 749 -58
上富田町 636 510 126
すさみ町 101 123 -22
那智勝浦町 319 527 -208
太地町 107 127 -20
古座川町 74 66 8
北山村 24 18 6
串本町 430 584 -154
```

## 出力をソートする

また、前で実行したコマンドをリダイレクトで使います。

ソートする場合は、sortコマンドを用います。
sortコマンドは、指定の区切り文字で分割したデータをソートするコマンドです。
今回は以下のオプションを設定します。

|オプション|引数|説明|
|---------|-------|----|
|-k|4|ソート基準となる項目番号|
|-n||ソート基準を数値として比較する|
|-r||降順で表示する|

```sh
[test@srv1 testAwk]$ grep "和歌山県" data/ssdse-2019a.csv | awk '{print $3,$25,$26,$25-$26}' | sort  -k 4 -n -r
上富田町 636 510 126
日高町 260 239 21
有田川町 611 593 18
古座川町 74 66 8
北山村 24 18 6
美浜町 275 289 -14
日高川町 270 289 -19
太地町 107 127 -20
九度山町 91 112 -21
すさみ町 101 123 -22
岩出市 1720 1753 -33
印南町 157 204 -47
白浜町 691 749 -58
広川町 142 202 -60
由良町 99 169 -70
かつらぎ町 360 430 -70
紀美野町 154 225 -71
高野町 88 168 -80
湯浅町 223 313 -90
みなべ町 196 345 -149
串本町 430 584 -154
御坊市 632 787 -155
那智勝浦町 319 527 -208
有田市 469 713 -244
新宮市 815 1068 -253
海南市 1042 1324 -282
橋本市 1260 1560 -300
和歌山市 7627 7938 -311
紀の川市 1278 1689 -411
田辺市 1691 2216 -525
```

## 結果
Linuxサーバ上で簡単なデータ処理が出来ました。
思ったより転出の方が多い。
上富田町が飛びぬけて増えている理由が知りたい。