Hatena::Grouptopcoder

kohyatohの日記

 - 非数学系な人のTopCoder参加記です。

2014-12-05データ処理に便利なコマンド

この記事はCompetitive Programming Advent Calendar 2014マラソン系5日目の記事です。


始めに

皆さんはUnixコマンドをお使いでしょうか?*1

Unixコマンドを使うと、様々なデータ処理を簡単に行うことができます。(Windowsの人はCygwinとかインストールしてください。)



この記事では、データ処理に便利なコマンドと、代表的な使い方を簡単に紹介します。

詳しいことは、コマンド名でググると色んな資料が出てくるはずです。

また、非常に基本的なコマンド(cd, ls, cat等)に関しては省略しています。

(ところで、ここで紹介するコマンドを使うとき、マラソンマッチ中に様々なデータをきちんと記録していることが大前提です。ここで言うデータとは、プログラムの(バージョン・seedごとの)スコアや実行ログ*2評価関数評価値などのことです。データを収集して分析することの大事さはchokudaiさんの昨日の記事でも述べられています。)


grep

言わずとしれた有名コマンドです。わざわざ紹介しなくてもよいかな、とも思いましたが、とても便利なので紹介しておきます。

$ grep "text" filename

とすると、filename内で"text"が含まれる行を抜き出すことができます。

"-n"でマッチした行番号の表示、"-v"オプションでマッチしない行の表示、"-r ."で(サブディレクトリを含む)ディレクトリ内検索もできます。


tee

標準入力をファイルに書き出しつつ、標準出力にも書き出すコマンドです。

例えば、上のgrepと組み合わせると

$ ./a.out | tee log.txt | grep ERROR

として、a.outの実行結果をlog.txtに保存しつつERRORの報告を見張る、ということができます。


head / tail

head -n N, tail -n Nでそれぞれ先頭N行の表示、末尾N行の表示ができます。

特に便利なのはtail -fで、これはファイルに追加された行をリアルタイムに表示させることができます。

例えば、1000個分のseedプログラムを走らせて結果をresults.txtに順次書き出すようなスクリプトバックグラウンドで走らせているとき、

$ tail -f results.txt

とすると結果が追加されていくのを眺めることができます。

$ tail -f log.txt | grep ERROR

のような使い方もよいですね。


cut / paste

tsvやcsvファイルを操作するためのコマンドです。

$ cut -d , -f 1,3 data.csv

とすると、data.csvの1, 3列目のみを取り出すことができます。

反対に、

$ paste -d , data1.csv data2.csv

とすると、data1.csvの列の後にdata2.csvが追加されたcsvが出力されます。

データをcsvファイルにまとめるとExcelLibreOfficeで眺めることができるので便利ですよ。


find / xargs

findコマンドは、条件に合うファイルを列挙します。

xargsは、標準入力を、与えられたコマンドの引数にして、与えられたコマンドを実行します。

$ find . -name "*.csv" | xargs paste -d ,

とすると、カレントディレクトリ以下にあるcsvファイルを全て連結します。(カレントディレクトリだけならpaste -d , *.csvで十分ですが)


sort

データをソートします。それだけです。


wc

ファイルの行数やバイト数を表示します。データサイズを確認するときなどに役立ちます。


(番外編1) Python / Ruby

Unixコマンドは強力ですが、シンプルな分限界があります。

もう少し複雑な処理を行う(統計値を出すとか、gnuplotgraphviz用に出力を整形する、等)時は、PythonRubyのようなスクリプト言語を覚えておくと便利です。

また、pythonirbは高機能な電卓代わりにも使えるので、ちょっとした計算や見積もりをするのにも役立ちます。


(番外編2) killall

データ処理関係ないですが、プロセスを殺すにはkillallが便利です。

ps+killでもいけますが、killallだとプログラム名(./a.outとか)を指定できる分お手軽です。

killallなので巻き添えにはご注意を。


(番外編3) xclip

上に述べたようなコマンドを使って、ターミナルで作業していると、ブラウザから提出する時にいちいちGUIエディタを開いてソースコードコピペするのが面倒になります。

そんなときにはxclipが便利です。

xclip -selection clipboard

でテキストをGnomeクリップボードに入れることができます。


終わりに

以上、簡単なコマンド紹介でした。

お役に立てれば幸いです。

「他にもこんなコマンド便利だよ!」というのがあれば、コメントに投稿していただけるとありがたいです。

*1:既に使ってるならこの記事読む必要ないかも

*2:実行ログには行ごとにタイムスタンプをつけると後々便利