windows上でテキストデータいじるならbusyboxを使ってみよう！ もうエクセル要らないかもよ

# 要約
**windows10上でテキストファイルの検索や加工に苦労しているなら、まずbusyboxを導入してみよう。**

busyboxの実行ファイルを一つ入れておくだけで、linuxやUNIX-like OSの世界で長年使われてきた歴史と実績あるテキスト操作ツール、grep, sed, awk, uniq, sort, head, tail他多数がwindowsマシンで使えるようになります。

圧倒的な簡単さと高効率に感動できるはず。

# よくあるテキスト処理

テキストファイルの加工やデータ処理。PCで仕事をするならどこかで避けて通れませんよね。 

たとえば……エクセルで作成され「タブ区切りテキスト」としてエクスポートされてきたファイルがあるとします。このファイルを対象に、データを抽出したり並べ替えたりとかしたい。**もちろんできるだけ簡単に！**

## 多くの人はこんなふうに対処しているだろう

古来、いろいろな方法が使われてきました。よくありそうな方法を並べてみると、次のようになるでしょう。

* MS wordでデータファイルを読み込み、必要な情報を手作業で新しいファイルに移す。
* あらためてMS Excelでデータファイルを読み込み、必要な情報を手作業で新しいファイルに移す。
* DOSプロンプト上で標準コマンドとバッチファイルにて変換処理を試みる。
* PowerShellを使ってテキスト処理のバッチ処理を試みる。

これらの方法にはいろいろ問題や限界があります。対象ファイルがめちゃくちゃでかかったり、数が多かったり、ちょっと特殊な条件でソートする必要がでてきたりした場合、たちまち立ち往生です。

## もっと気の利いた手法がある

そうした案件にも柔軟かつ迅速に対応できる手法があります。linuxはじめUNIX-like OSの元で長く整備されてきたテキスト処理用ツールを使い分けるのです。sort, uniq, grep, awk, head, tail, cut, paste, wc エトセトラエトセトラ。これらのツールは神ツールです。神ツールを組み合わせることでできるシェルスクリプトの柔軟さはもう圧倒的です。

「linuxとか言われても…windowsから離れるわけには行かない」という人は少なくないでしょう。しかし、何も専用linuxマシンを用意しなくても簡単にwindows上で神ツールを使いまくれる算段が幾通りか存在するのです。

今回紹介したいbusyboxはそうした算段の一つで、他に比べてセットアップが圧倒的に容易です。

# busyboxとは

busyboxはunix-like OSではおなじみの各種コマンドの機能を一身に内蔵した十徳ナイフ的ツールです。

* [WindowsでLinuxのコマンドが使える「BusyBox」 - 頑張らないために頑張る](https://ysko909.github.io/posts/busybox-on-windows/)

# 環境設定

0. まず、[windows用busybox実行ファイルの最新版](https://frippery.org/files/busybox/busybox.exe)をダウンロードします。
0. 上記の通りにたった今ダウンロードしてきたbusybox.exeを、「[PATHが通されたディレクトリ](https://proengineer.internous.co.jp/content/columnfeature/5205)」に置きます。
0. 終了です！

これだけでDOSプロンプト下でbashをはじめ、head, tail, awk, grep, sed, sort ...などのツールが使えるようになります。

# 実践

私の環境では`d:\mydocument`の下にいろいろtab区切りテキストファイル（tsvファイル）が置いてあるので、これを試しにソートしてみることにします。まず普通に[コマンドプロンプト](https://www.atmarkit.co.jp/ait/articles/1709/13/news032_2.html)(DOS窓)[^1]からファイル内容を出力してみましょう。

[^1]: DOS窓を呼び出し方法を覚えていない？ windowsキー＋Rから`cmd`と入力すると「黒い画面」がでてくるはずです。

```
D:\mydocument>type test.tsv
ID      Value
AA      1
ZZ      2
BB      20
CC      2
AA      2
AB      3
```

このテキストファイルをサンプルデータとしていろいろ試してみましょう。
なお、この画面では分かりませんが、当該ファイルの列の区切りはタブ文字となっています。

## コマンドラインで試行錯誤してみる

busybox経由でとりあえずソートしてみます。1行目はそのまま、2行目以降を普通に文字列としてソートします。

```
D:\mydocument>busybox64 bash -c "head -n 1 test.tsv && tail -n +2 test.tsv | sort"
ID      Value
AA      1
AA      2
AB      3
BB      20
CC      2
ZZ      2
```

条件を少し複雑化して、2列目を数値キーとしてソートし、さらに1列目でソートしてみます。

```
D:\mydocument>busybox64 bash -c "head -n 1 test.tsv && tail -n +2 test.tsv | sort -k 2n,2 -k 1,1"
ID      Value
AA      1
AA      2
CC      2
ZZ      2
AB      3
BB      20
```

## 定型的な処理はシェルスクリプトファイルにまとめよう

毎回これらのコマンドを打ち込むのは面倒なのでシェルスクリプトにしてみます。

次のような内容のファイルを作成してsorttest.shという名前で保存します。

```
#!/bin/sh
infile=$1
outfile=${infile}.out
(head -n 1 ${infile} && tail -n +2 ${infile} | sort -k 2n,2 -k 1,1) | sed 's/\r$//; s/$/\r/' > ${outfile}
```

とりあえず、コマンドラインから対象ファイル名を読み取り、その後ろに`.out`をつけた名前のファイルにソート結果をセーブするという仕様としてあります。改行コードをwindowsのスタイルで統一する処理を加えています。

実行してみます。

```
D:\mydocument>busybox64 bash sorttest.sh test.tsv

D:\mydocument>type test.tsv.out
ID      Value
AA      1
AA      2
CC      2
ZZ      2
AB      3
BB      20
```

# おわりに

というわけで、busyboxの存在はもっと知られてもいいのではないかと思う次第です。より本格的にやりたければMSYS2とかWindows Subsystem for Linuxを考えるべきですが、ファイルをたった一個ダウンロードしてくるだけで準備完了という手軽さは、他の追随を許さない美点と言えます。

まだバッチファイルやPowerShellで消耗しますか？ 半日かけて組んだ20行のそのバッチファイル、awkなら40文字の一行スクリプトで片付くかもしれませんよ？

この記事は、以下のＱ＆Ａにおいて筆者が書いた解答をQiita用に仕立て直したものです。

* [PowerShell - windowsのコマンドラインでcsv(tsv)ファイルのソート｜teratail](https://teratail.com/questions/266736#reply-381797)