- 非数学系な人のTopCoder参加記です。
2014-12-05データ処理に便利なコマンド
この記事はCompetitive Programming Advent Calendar 2014のマラソン系5日目の記事です。
始めに
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ファイルにまとめるとExcelやLibreOfficeで眺めることができるので便利ですよ。
find / xargs
findコマンドは、条件に合うファイルを列挙します。
xargsは、標準入力を、与えられたコマンドの引数にして、与えられたコマンドを実行します。
$ find . -name "*.csv" | xargs paste -d ,
とすると、カレントディレクトリ以下にあるcsvファイルを全て連結します。(カレントディレクトリだけならpaste -d , *.csvで十分ですが)
sort
データをソートします。それだけです。
wc
ファイルの行数やバイト数を表示します。データサイズを確認するときなどに役立ちます。
(番外編1) Python / Ruby
Unixコマンドは強力ですが、シンプルな分限界があります。
もう少し複雑な処理を行う(統計値を出すとか、gnuplotやgraphviz用に出力を整形する、等)時は、PythonやRubyのようなスクリプト言語を覚えておくと便利です。
また、pythonやirbは高機能な電卓代わりにも使えるので、ちょっとした計算や見積もりをするのにも役立ちます。
(番外編2) killall
データ処理関係ないですが、プロセスを殺すにはkillallが便利です。
ps+killでもいけますが、killallだとプログラム名(./a.outとか)を指定できる分お手軽です。
killallなので巻き添えにはご注意を。
(番外編3) xclip
上に述べたようなコマンドを使って、ターミナルで作業していると、ブラウザから提出する時にいちいちGUIのエディタを開いてソースコードをコピペするのが面倒になります。
そんなときにはxclipが便利です。
xclip -selection clipboard
でテキストをGnomeのクリップボードに入れることができます。
終わりに
以上、簡単なコマンド紹介でした。
お役に立てれば幸いです。
「他にもこんなコマンド便利だよ!」というのがあれば、コメントに投稿していただけるとありがたいです。
2012-03-29
Codeforces #114 C (Wizards and Numbers)
解けなかった&解法を見ても理解できなかったので復習。
問題文は
http://codeforces.com/problemset/problem/167/C
下のような思考をできれば解けたのではないかと思われる。
2011-12-13
team WAKABAでした練習のまとめ
この記事は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
Easy | 300 | RectangleArea | Opened | 数学ではない |
Medium | 500 | SetMultiples | Opened | sqrt |
Hard | 1000 | PerfectSequences2 | Unopened | - |
惨敗。
負けるとブログに書く事は少なくなります。
2011-04-28
CodeChef April Cook-Off : The Grand Cook Off の証明 (というか計算方法)
CodeChef |
終了後も証明ができずにうんうん唸っていたのでそのまとめ。
確率とか場合の数とか苦手...
間違ってたら指摘をお願いします。