Linuxに限らず、UNIX系のOSにはちょっとした機能しか持たないコマンドが用意されている。機能面で言えば、awkコマンドやsedコマンド、grepコマンドがあれば事足りることが多いなか、そうしたささやかな機能のコマンドが用意されているのは、それが便利だからにほかならない。今回はそんなコマンドの1つである「tr」を取り上げようと思う。
結構使える、trコマンド
trコマンドは、標準入力から入ってきた文字を指定したほかの文字に入れ替えたり、指定した文字を削除したりするコマンドだ。動作が単純なので、説明するよりも実際の使用例をご覧いただいたほうがわかりやすいだろう。
例として、CSVファイル「os.csv」を用意した。
% cat os.csv
順位,プロダクト,今月のシェア,先月のシェア,推移
"1","Windows","91.51%","91.64%","↓"
"2","Mac","6.12%","6.36%","↓"
"3","Linux","2.36%","1.99%","↑"
%
これに対し、次のように指定してtrコマンドを実行すると、カンマがタブに変換されたデータが出力される。
% cat os.csv | tr ',' '\t'
順位 プロダクト 今月のシェア 先月のシェア 推移
"1" "Windows" "91.51%" "91.64%" "↓"
"2" "Mac" "6.12%" "6.36%" "↓"
"3" "Linux" "2.36%" "1.99%" "↑"
%
trコマンドは、何もオプションを指定していない場合、1つ目の引数に指定した文字を2つ目の引数で指定した文字に変換する処理を行う。上記の場合「tr ‘,’ ‘\t’」と実行しているので、カンマがタブに変換されるわけだ。
そのほか、trコマンドは「指定した文字を削除する」という目的でも使われる。例えば、次のように-dオプションを指定すると、タブルクォーテーションが削除された状態で出力される。
% cat os.csv | tr ',' '\t' | tr -d '"'
順位 プロダクト 今月のシェア 先月のシェア 推移
1 Windows 91.51% 91.64% ↓
2 Mac 6.12% 6.36% ↓
3 Linux 2.36% 1.99% ↑
%
また、trコマンドでは文字列を指定することもでき、指定された順序ごとに変換処理が行われる。さらに範囲指定を使えるので、次のように小文字を大文字に変換するといった処理にも使われることが多い。
% cat os.csv | tr ',' '\t' | tr -d '"' | tr 'a-z' 'A-Z'
順位 プロダクト 今月のシェア 先月のシェア 推移
1 WINDOWS 91.51% 91.64% ↓
2 MAC 6.12% 6.36% ↓
3 LINUX 2.36% 1.99% ↑
%
「指定した文字の順序ごとに変換される」というのも、実際に見たほうがわかりやすい。例えば、次のようなデータがあったとする。
% cat head
# $FreeBSD: releng/11.0/COPYRIGHT 292983 2015-12-31 11:21:45Z bz $
# @(#)COPYRIGHT 8.2 (Berkeley) 3/21/94
%
次のように引数を指定してtrコマンドを実行すると、括弧を別の種類の括弧に変換することができる。
% cat head | tr '()' '{}'
# $FreeBSD: releng/11.0/COPYRIGHT 292983 2015-12-31 11:21:45Z bz $
# @{#}COPYRIGHT 8.2 {Berkeley} 3/21/94
%
指定した順序に対応するように、文字の変換が行われていることがわかるだろう。
あまり使われているところは見ないのだが、trコマンドには「-s」というオプションがあり、これを指定すると連続する文字が最初の1文字だけにトリミングされる。例えば、次のようにところどころに空行があるCSVファイルがあったとする。
% cat os2.csv
順位,プロダクト,今月のシェア,先月のシェア,推移
"1","Windows","91.51%","91.64%","↓"
"2","Mac","6.12%","6.36%","↓"
"3","Linux","2.36%","1.99%","↑"
%
このファイルに対し、-sオプションを指定してtrコマンドを実行すると、連続する改行が単一の改行に変換される。
% cat os2.csv | tr -s '\n'
順位,プロダクト,今月のシェア,先月のシェア,推移
"1","Windows","91.51%","91.64%","↓"
"2","Mac","6.12%","6.36%","↓"
"3","Linux","2.36%","1.99%","↑"
%
空行は要するに改行コードが連続している結果なので、それを単一の改行コードに変換すれば空行が消えるというわけだ。
こうした変換処理はsedコマンドを使えば実現できるが、trコマンドはこうした処理に特化しており、sedコマンドで書くよりも簡単に同じことを記述できる。案外便利なコマンドなので、覚えておくと役に立つはずだ。さらっとtrコマンドを使えるようになろう。