[A-00027]Shellでユニットセパレーターを置換する
ファイルを扱っていると区切り文字という特殊な文字を目にする機会がある。
そのうちの一つでユニットセパレーターをShellで扱う方法を記載する。
UTF8では何も表示されないのだがviで開いた際には特殊文字として表示される。
aiueo^_kakikukeko^_sashisuseso^_naninuneno
上記の通り、通常表示できない文字(“^_”)として認識される。※UTF16であれば何かしらの文字として表示される。
このユニットセパレーターをカンマに変換してCSVファイルを作成する。
xxd -p -c 68719476736 unitseparator.txt | sed s/1f/2c/g | xxd -p -r > unitseparator.csv
上記はxxdコマンドで16進数に変換した後、sedでユニットセパレーター(1f)をカンマ(2c)に変換し、再度16進数を元に戻すという方法である。結果はunitseparator.csvに吐き出す。
実行後の結果は下記の通り。
aiueo,kakikukeko,sashisuseso,naninuneno
sedやawkではそのままではバイナリを扱えないので一度進数表示に変える必要がある。
手間ではあるが、Shellで変換するには今のところこの方法しか思い浮かばない。
awkを使用したセパレーティング
awkが非常に使い勝手が良いのでこちらの実装も記載しておく。
いちいちバイナリを使わなくても、バイナリから文字列化した値を使用すれば容易にセパレーティングできる。
SEPARATOR="$(printf '\x1f')"
次にawkにセパレーターを渡して対象ファイルの特定の項目を取得して吐き出す。
awk -F "${SEPARATOR}" '{print $1}' unitseparator.txt
#!/bin/bash
SEPARATOR="$(printf '\x1f')"
awk -F "${SEPARATOR}" '{print $1}' unitseparator.txt
実行結果は以下の通りである。
anonymous-MacBook-Pro:$ ./test.sh
aiueo
次にインプットファイルが複数行ある場合、どうなるかを確認する。
aiueokakikukekosashisusesonaninuneno
yayuyoririrureropapipupepakasatana
hahifuhehokakikohahifuhehohamayarawa
mamimumemonanunorarirurerowaiueo
anonymous-MacBook-Pro:$ ./test.sh
aiueo
yayuyo
hahifuheho
mamimumemo
行が複数ある場合にはそれぞれの1列目を取得して表示してくれる。
大変便利なツールである。
また、whileループを使うよりもawkでフィルタリング処理を実装した方が圧倒的に速い為、こちらを使用する事をお勧めする。
コメントを残す