Macで実験結果をまとめる

| Topic path: Top / その他 / Macで実験結果をまとめる

*はじめに [#nb6baa4e]

Macで実験した結果をまとめるときに使えるコマンドを紹介します.

環境はOS X 10.8.2 Mountain Lion,ターミナルのシェルは標準のbashです.
使用例の $ はbashのコマンド・プロンプトを表しています.(入力しません.)

それぞれのコマンドの使い方は,''man''コマンドで調べてください.
#geshi(sh){{
$ man コマンド名
}}

'''例''':cat コマンドの使い方を調べる.
#geshi(sh){{
$ man cat
}}


*目次 [#e0ea41c5]
#contents


*Tips [#g9e82f13]

**コマンド [#t3808664]
***空のファイルを作成する [#xb9012af]
''touch''コマンド
#geshi(sh){{
$ touch ファイル名
}}

'''例''':result.txt という名前のからのファイルを作成する.
#geshi(sh){{
$ touch result.txt
}}


***文字列を出力する [#adc3fead]
''echo''コマンド
#geshi(sh){{
$ echo 文字列
}}

'''例''':done. と出力する
#geshi(sh){{
$ echo "done."
}}


***ファイルの内容を出力する [#eb5e394a]
''cat''コマンド
#geshi(sh){{
$ cat ファイル名1 ファイル名2 ...
}}
ファイル名を指定しないときは,標準入力が対象となります.

'''例''':ファイル foo とファイル bar の内容を続けて出力する.
#geshi(sh){{
$ cat foo bar
}}

'''例''':ファイル result.txt の内容を行番号付きで出力する.
#geshi(sh){{
$ cat -n result.txt
}}


***ファイルの先頭を出力する [#le3bbc74]
''head''コマンド
#geshi(sh){{
$ head -行数 ファイル名
}}
ファイル名を指定しないときは,標準入力が対象となります.

'''例''':ファイル result.txt の最初の20行だけを出力する.
#geshi(sh){{
$ head -20 result.txt
}}


***ファイルの末尾を出力する [#v3f3c71f]
''tail''コマンド
#geshi(sh){{
$ tail -行数 ファイル名
}}
ファイル名を指定しないときは,標準入力が対象となります.

'''例''':ファイル result.txt の末尾20行だけを出力する
#geshi(sh){{
$ tail -20 result.txt
}}


***指定した文字列を含む行だけを出力する [#j3443a19]
''grep''コマンド
#geshi(sh){{
$ grep 文字列 ファイル名
}}
ファイル名を指定しないときは,標準入力が対象となります.

'''例''':ファイル result.txt の中で # を含む行だけを出力する.
#geshi(sh){{
$ grep '#' result.txt
}}


***指定した正規表現を含む行だけを出力する [#r316db01]
''egrep''コマンド
#geshi(sh){{
$ egrep 正規表現 ファイル名
}}
ファイル名を指定しないときは,標準入力が対象となります.

'''例''':ファイル result.txt の中で行の先頭に # を含まない行だけを出力する
#geshi(sh){{
$ egrep -v '^#' ファイル名
}}


***指定した文字列を置換する [#rf2bb250]
''sed''コマンド
#geshi(sh){{
$ sed 's/置換前文字列/置換後文字列/g' ファイル名
}}

'''例''':ファイル result.txt に含まれる文字列 XML を文字列 xml に置換する.
#geshi(sh){{
$ sed 's/XML/xml/g' result.txt
}}


***ファイルの行数を調べる [#fcf94af9]
''wc''コマンド
#geshi(sh){{
$ wc -l ファイル名
}}
ファイル名を指定しないときは,標準入力が対象となります.

'''例''':ファイル resutl.txt の行数を調べる
#geshi(sh){{
$ wc -l result.txt
}}


***CSVファイルの指定した列だけを出力する [#r7ece8b5]
''cut''コマンド
#geshi(sh){{
$ cut -d, -f列番号 ファイル名
}} 
ファイル名を指定しないときは,標準入力が対象となります.
-dオプションは区切り文字を表します.

'''例''':ファイル result.csv の2列目から4列目までを出力する
#geshi(sh){{
$ cut -d, -f2-4 resutl.csv
}}


***CSVファイルを指定した列で並べ替える [#c709855b]
''sort''コマンド
#geshi(sh){{
$ sort -t, -kキー列番号 ファイル名
}}

'''例''':ファイル result.csv を2列目の辞書順に並べ替える.
#geshi(sh){{
$ sort -t, -k2 result.csv
}}

'''例''':ファイル result.csv を3列目の値の昇順に並べ替える.
#geshi(sh){{
$ sort -t, -k3 -n result.csv
}}

'''例''':ファイル result.csv を1列目の値の降順に並べ替える.
#geshi(sh){{
$ sort -t, -k1 -n -r result.csv
}}


***CSVファイルの指定した列の合計を求める [#ea383488]
''awk''コマンド
#geshi(sh){{
$ awk -F, 'BEGIN{s=0}{s+=$列番号}END{print s}' ファイル名
}}

'''例''':ファイル result.csv の2列目の値の合計を求める
#geshi(sh){{
$ awk -F, 'BEGIN{s=0}{s+=$2}END{print s}' result.csv
}}


***CSVファイルの指定した列の平均を求める [#j017e18f]
''awk''コマンド
#geshi(sh){{
$ awk -F, 'BEGIN{s=c=0}{sum+=$列番号;c++}END{print s/c}' ファイル名
}}

'''例''':ファイル result.csv の3列目の値の合計を求める
#geshi(sh){{
$ awk -F, 'BEGIN{s=c=0}{s+=$3;c++}END{print s/c}' result.csv
}}




**シェル [#tcc14239]
***規則性のある名前のファイルをまとめて指定する [#i0302738]

ワイルドカードを使います.
-''*''  (アスタリスク)0文字以上の任意の文字列
-''?''  (クエスチョン・マーク)任意の1文字
-''[文字列]''  (角かっこ)文字列に含まれる文字のいずれか
-''[!文字列]''  (角カッコとエクスクラメーション・マーク)文字列に含まれない文字のいずれか

例:resultで始まり,拡張子が.txtであるファイルのリストを表示する.
#geshi(sh){{
$ ls result*.txt
}}

例:result0.txtからresult9.txtのファイルの内容を続けて出力する.
#geshi(sh){{
$ cat result[0-9].txt
}}


***複数の処理を連続して行う [#v892108c]
セミコロン '';'' で区切ります.
#geshi(sh){{
処理1; 処理2
}}

例:HelloとWorldを連続して出力する
#geshi(sh){{
$ echo "Hello"; echo "World"
Hello
World
}}


***ある処理の出力を次の処理の入力にする [#u4fbfd03]
パイプ ''|'' で区切ります.
#geshi(sh){{
$ 処理1 | 処理2
}}

例:ファイル result.txt の # を含む行だけを出力し,行番号を付ける.
#geshi(sh){{
$ grep '#' result.txt | cat -n
}}


***処理の結果をファイルに書き込む [#p9636e40]
リダイレクション ''>''
#geshi(sh){{
$ 処理 > ファイル名
}}

'''例''':ファイル result.txt に行番号を付けて n_result.txt に書き込む
#geshi(sh){{
$ cat -n result.txt > n_result.txt
}}


***処理の結果をファイルの末尾に追加する [#cb410308]
リダイレクション ''>>''
#geshi(sh){{
$ 処理 >> ファイル名
}}

'''例''':ファイル result.txt の末尾に現在の時刻を追加する
#geshi(sh){{
$ date >> result.txt
}}




***複数のファイルに同じ処理をする [#a65e35c0]
作業ディレクトリーにresult*という複数のファイルがあるとします.
''for''文
#geshi(sh){{
$ for i in result*
$ for i in ワイルドカードを含むファイル名
> do
> 処理
> done
}}

これは,次のように,一行でも書けます.
次のように一行でも書けます.
#geshi(sh){{
$ for i in result*; do 処理; done
$ for i in ワイルドカードを含むファイル名; do 処理; done
}}

'''例''':ファイル名が result で始まり拡張子が .txt であるファイルの名前を出力する.
#geshi(sh){{
for i in result*.txt; do echo $i; done
}}



**組み合わせ例 [#y65a2e34]

***指定した文字列を含む行の数を調べる [#t7884e9b]
'''例''':ファイル result.txt の中で,hit という文字列を含む行の数を調べる.
#geshi(sh){{
$ grep hit result.txt | wc -l
}}


***複数のファイルの指定した行だけをまとめて出力する [#u0e43c09]
'''例''':ファイル名が result で始まり拡張子が .txt であるファイルの 10 行目だけをまとめて出力する.
#geshi(sh){{
$ for i in result*.txt; do head -10 $i | tail -1; done
}}


***指定した行に指定した文字列を含むファイルの数を調べる [#v2d87dca]
'''例''':ファイル名が result で始まり拡張子が .txt のファイルの中で10行目に success という文字列を含むファイルの数を調べる.
#geshi(sh){{
$ (for i in result*.txt; do head -10 $i | tail -1 | grep success; done) | wc - l
}}


気が向いたら追加します.
トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS