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:実行ログには行ごとにタイムスタンプをつけると後々便利

2012-03-29

Codeforces #114 C (Wizards and Numbers)

| 00:50

解けなかった&解法を見ても理解できなかったので復習。

問題文は

http://codeforces.com/problemset/problem/167/C

下のような思考をできれば解けたのではないかと思われる。

続きを読む

2011-12-13

team WAKABAでした練習のまとめ

| 00:32

この記事はCompetitive Programming Advent Calendar 13日目の参加記事です。

ICPC2011にteam WAKABAとして参加し、チームで練習して結構良い感じだったので、そのまとめです。

(1)具体的に何をしたか?、 そして (2)得られた経験則(効率のよい練習/努力の報われない練習について)と続きます。

競技プログラミングにはある程度慣れたけど、伸び悩んでしまった、というような人に読んでもらえると幸いです。


ちなみに、team WAKABAのメンバーは、練習開始時(2010年7月頭)からICPCアジア地区予選直前(2011年11年頭)で、

OgieKako: 2116 -> 2766

rankalee: 1592 -> 2027

kohyatoh: 1548 -> 2314

TopCoderのレートがインフレしたので、割と効果のある練習だったと思います。*1


続きを読む

*1:その後落ちてんじゃん、とかのツッコミはなしで...

2011-05-04

SRM505

| 03:36

ソース・成績(要ログイン)

Easy300RectangleAreaOpened数学ではない
Medium500SetMultiplesOpenedsqrt
Hard1000PerfectSequences2Unopened-

惨敗。

負けるとブログに書く事は少なくなります。

続きを読む

2011-04-28

CodeChef April Cook-Off : The Grand Cook Off の証明 (というか計算方法)

| 08:17

終了後も証明ができずにうんうん唸っていたのでそのまとめ。

確率とか場合の数とか苦手...

間違ってたら指摘をお願いします。


続きを読む

CodeChef April Cook-Off

| 07:33

結果

AThe Grand Cook OffAC (02:24)確率
BProduct of Digits AgainWA/TLE数学?
CInternet Media TypesAC (00:44)やるだけ
DFrosting CupcakesOpened??
EA Prime ConjectureAC (00:52)やるだけ

続きを読む