[shell]ふりがなデータをローマ字表記に変換して特定列に追加

- よくある「名前・読み(ふりがな)」の項目が入ったデータだが、新たにローマ字の項目を追加したい。
- だが手動で読みから判断して一つ一つ入力するのは時間がかかる。
- そこで今回は[uconv](https://linux.die.net/man/1/uconv)というshellで扱える便利コマンドを利用して変換後、特定列に追加する方法を記録する。

## 実現すること
- 以下のようなTSV形式のデータがある。

|名前|読み|生年月日|出身地|所属コード|
|:---:|:---:|:---:|:---:|:---:|
|亜|あ|20xx/xx/xx|東京都|1|
|＊＊＊|＊＊＊|＊＊＊|＊＊＊|＊＊＊|
|＊＊＊|＊＊＊|＊＊＊|＊＊＊|＊＊＊|
|＊＊＊|＊＊＊|＊＊＊|＊＊＊|＊＊＊|

- 上記の読みデータをコマンドを使用してローマ字表記に変換して、**「読み」** と **「生年月日」** の項目の間に新たに以下のように追加。

|名前|読み|ローマ字|生年月日|出身地|所属コード|
|:---:|:---:|:---:|:---:|:---:|:---:|
|亜|あ|a|20xx/xx/xx|東京都|1|
|＊＊＊|＊＊＊|＊＊＊|＊＊＊|＊＊＊|＊＊＊|
|＊＊＊|＊＊＊|＊＊＊|＊＊＊|＊＊＊|＊＊＊|
|＊＊＊|＊＊＊|＊＊＊|＊＊＊|＊＊＊|＊＊＊|

## 環境
- Mac OS X 10.15.6

## 手順

### uconvコマンドのインストール
- 標準環境に入っているコマンドでは厳しいため、[uconv](https://linux.die.net/man/1/uconv)というデータ変換コマンドを利用する。
- まず、以下のコマンドでuconv付属のライブラリをインストールする。

```bash
brew install icu4c
```

- インストール後はパスを通すかエイリアスを設定する必要があるため、以下の`~/.zshrc`もしくは`~/.bashrc`にaliasを追加する。

```sh:~/.zshrc
# こちらのpathは「brew list icu4c | grep uconv」で確認する。
alias uconv='/usr/local/Cellar/icu4c/69.1/bin/uconv'
```

- `uconv --version`と入力して、バージョン情報が表示されることを確認する。

### サンプルデータ用意
- 今回は[こちらのサイト](https://tm-webtools.com/Tools/TestData)で作成した以下のデータを`sample.tsv`として保存して利用する。

```text:sample.tsv
名前	読み	生年月日	出身地	所属コード
佐瀬 竜三	サセ リュウゾウ	1960/12/9	秋田県	05
福村 重光	フクムラ シゲミツ	1989/8/27	石川県	17
立野 夢	タチノ ユメ	1997/10/15	山形県	06
長沼 綾奈	ナガヌマ アヤナ	2008/7/29	香川県	37
坂井 正雄	サカイ マサオ	1993/3/31	富山県	16
中村 奈保美	ナカムラ ナホミ	1979/1/30	山形県	06
清野 金蔵	キヨノ キンゾウ	1985/1/30	山口県	35
成瀬 勝三	ナルセ カツゾウ	1982/2/18	長野県	20
幸田 矩之	サチダ ノリユキ	1982/9/2	神奈川県	14
原田 裕司	ハラタ ユウジ	1997/10/9	新潟県	15
```

### 変換及び追加
- コマンドとデータの用意が整ったため、uconvでの変換と追加作業をしていく。
    - **※[uconvコマンドの基本使用例及び詳細はこちらを参照](https://linux.die.net/man/1/uconv)。**
- まず以下のようにuconvを用いて読み(ふりがな)データがローマ字に変換できることを確認する。

```bash
awk -F '\t' 'NR>1{print $2}' sample.tsv | uconv -x latin

sase ri~yuuzou
fukumura shigemitsu
tachino yume
naganuma ayana
sakai masao
nakamura nahomi
kiyono kinzou
naruse katsuzou
sachida noriyuki
harata yuuji
```

- 上記のような変換を確認後、以下のコマンドで **「読み」と「生年月日」の間に「ローマ字」** 列が追加されることを確認する。
    - **※可読性のため、ワンライナーを改行。**

```bash:方法1
paste \
<(cut -f1-2 sample.tsv) \
<(echo "ローマ字";awk -F '\t' 'NR>1{print $2}' sample.tsv | uconv -x latin) \
<(cut -f3- sample.tsv)

名前	読み	ローマ字	生年月日	出身地	所属コード
佐瀬 竜三	サセ リュウゾウ	sase ri~yuuzou	1960/12/9	秋田県	05
福村 重光	フクムラ シゲミツ	fukumura shigemitsu	1989/8/27	石川県	17
立野 夢	タチノ ユメ	tachino yume	1997/10/15	山形県	06
長沼 綾奈	ナガヌマ アヤナ	naganuma ayana	2008/7/29	香川県	37
坂井 正雄	サカイ マサオ	sakai masao	1993/3/31	富山県	16
中村 奈保美	ナカムラ ナホミ	nakamura nahomi	1979/1/30	山形県	06
清野 金蔵	キヨノ キンゾウ	kiyono kinzou	1985/1/30	山口県	35
```

- ※方法1のような`<()`を用いたプロセス置換がない環境であれば以下のコマンドを利用する。
    - **※こちらは方法1に比べて速度が遅いため、プロセス置換が使えない環境のみ使用**

```bash:方法2
cat sample.tsv |
awk -F '\t' 'BEGIN{OFS="\t"} \
{if(NR!=1){c="echo "$2" | uconv -x latin";c | getline r;close(c);}else{r="ローマ字"}print $1,$2,r,$3,$4,$5}'

名前	読み	ローマ字	生年月日	出身地	所属コード
佐瀬 竜三	サセ リュウゾウ	sase ri~yuuzou	1960/12/9	秋田県	05
福村 重光	フクムラ シゲミツ	fukumura shigemitsu	1989/8/27	石川県	17
立野 夢	タチノ ユメ	tachino yume	1997/10/15	山形県	06
長沼 綾奈	ナガヌマ アヤナ	naganuma ayana	2008/7/29	香川県	37
坂井 正雄	サカイ マサオ	sakai masao	1993/3/31	富山県	16
中村 奈保美	ナカムラ ナホミ	nakamura nahomi	1979/1/30	山形県	06
清野 金蔵	キヨノ キンゾウ	kiyono kinzou	1985/1/30	山口県	35
```

- 上記の方法で問題なければ完了。

## まとめ
- shellでのひらがなやカタカナの扱いは難航するかと感じていたが、便利コマンドを利用することで簡素化を図ることができた。
- 他にも様々便利コマンドが存在していたため、必要に応じて利用していくことにする。

## 参考
- [uconv](https://linux.die.net/man/1/uconv)
- [テストデータジェネレータ](https://tm-webtools.com/Tools/TestData)