Unixコマンドによるデータ処理

一時期研究で,データの集計処理をよくやったので,その時学んだこと,使用したUnixコマンドのまとめ.
WindowsUnixコマンドを使いたいなら是非ともCygwinを入れてminttyを使いましょう.

私の環境はCygwinだったので,Unixコマンドとか言っておきながら,以下の内容はどちらかといえばCygwin向け.

データの表現形式

Unixコマンドに適したデータ形式TSV(Tab Separated Values)だ.XMLCSVUnixコマンドに向いていない場面が多くて使いづらい.

さらにWindowsでは,改行文字をLFに統一した方がいい.後で触れるが,perlを使用することを考えると,改行文字はLFで統一されるべき.

入出力コマンド

cat,more,teeの3つはデータ処理をする際の最重要コマンドである.以下それぞれの役割.

  • catはデータの入力に使用.ファイルを引数に取れるコマンドもあるが,統一性があるとは言いがたく使いづらいので,catで統一したほうが楽
  • moreはコマンドが望みどおりに動いているか確認するために使用.とにかくまずはmoreで確認してから実行しなきゃ危険.
  • teeはデータの処理結果を出力するのに使用.出力するだけならリダイレクトでもいい.しかし,処理が止まっていないか確認するためには,出力が見られる状態にしておく必要がある.teeはコンソールへの出力とファイルリダイレクトを素直にやってくれる.

データの抽出コマンド

TSVファイルを使っていると,2カラム目のデータだけを取りたい,ということがよくある.そういうときにはcutをfオプションつきで使おう.2カラム目を取り出したければ,

  • cut -f2

と実行すればよい.2から5カラム目を取り出したいのなら,

  • cut -f2-5

2カラム目を取り出したいのなら

  • cut -f2-

とする.

データの表現形式としてTSVを進める理由は,このようにUnixコマンドとの相性が良いからなのだ.

ソート

要素のソートにはその名もずばりsortを使う.詳細は,http://linuxjm.sourceforge.jp/html/gnumaniak/man1/sort.1.html
で確認して欲しい.

数値のソートには-nオプションを使用し,降順でソートしたい場合は-rをオプションを併用する.
その他便利なオプションには-kオプションが挙げられる.これはソートする際に使用するフィールドのカラムを指定するオプションで,2カラム目の値だけでソートしたければ,

  • sort -k2

と書く.

重複排除とカウント

重複した要素を削除したい状況はよくある.このときはuniqコマンドを使用する.-cオプションを併用することで,入力対象のデータ中にある要素を数えることができる.これが非常に便利.

なお,uniqは必ず事前にデータをソートしておかなければならない.要注意

データの加工

正規表現grep的なデータの加工をしなければならないことはよくある.
それぞれ専用のunixコマンドがあるが,覚えるのが面倒,統一性が無い,使いづらいなどなど欠点が多い.

よって私はワンライナーperlの使用を勧める.まず,正規表現でデータを加工したい際は,

とする.grepをしたい際には,

とする.

perlを使えば,正規表現の他にも多種多様な命令を使える.ワンライナーで書くのが面倒になればスクリプトとしてファイルに書きだすという手もあり,sedgrepを覚えるよりも汎用性が高くて便利である.

要するにWindowsを使う人間は皆Cygwinperlワンライナーを書くべきなのである.