データファイル処理に便利なUNIXコマンド
(一部工事中、順次拡張予定)ここでは、データファイル処理に便利なUNIXコマンドの紹介を行います。
使用目的から探す - 実例集 -
- 複数のファイルをくっつけたい
- ファイルのある行を読み飛ばしたい awk
- ファイルの空行を読み飛ばしたい awk
- ファイルのある列とある列を用いて演算を行いたい awk
- ファイルの特定の文字を別の文字に変換(置換)したい sed
- データのフォーマットを揃えたい awk
- 1を01のように、頭にゼロをつけたい(ゼロプディング)
- 0.035を3.5E-2のように、指数表示にしたい、など。
- ファイル名から、ディレクトリ名あるいは拡張子を取り除きたい basename
- 画面に出ている絵(ウインドウ)をクリックして、その絵をそのまま印刷したい(画面ダンプ) xwd
- 一つの紙を分割して、縮小して印刷したい mpage
コマンド名から探す - コマンドリファレンス -
コマンドリファレンス
awk
- 行単位でデータファイルを様々に加工する
awk(おーく)は、入力データ1行ごとに各列の様々な処理を行うコマンドである。 ここで、行とはファイルデータの横のライン、列とは縦のラインである。 awkを用いると、例えば「ファイルの2列目を2倍する」というような操作もコマンドライン一行で可能になる。
基本形は、
% awk '条件文{実行文}' ファイル名である。'は「Shiftキー+数字の7」である。括弧は「中括弧」{}でなくてはならない。 また、条件文は省略可能である。 例えば、3列あるデータファイルのうち、1列目はそのまま、2列目は2倍、3列目は3で割りたいというときは、% awk '{print $1,$2*2.0,$3/3.0}' datafileとする。ここで、print文中の$1は1列目を表す。各列は,で区切る。print文中ではC言語の主な演算記号が使える。以下に、awkによる処理の例を挙げる。
% awk '$1 > 4.0{print}' datafile ある条件に一致した行のみを出力する。この例は一列目が4.0よりも大きければ出力。 print文で列を指定しなければ全列が出力される。$0と明示的に指定することも可能。% awk '$1 <= 5.0 {print $3} $1 > 10.0 {print $2}' datafile 複数の条件によって出力パターンを変える。 例では、1列目が5以上なら3列目を出力し、1列目が10より大きければ2列目を出力。% awk `$1 == "S"{print}` datafile 条件文の中で比較対象が文字の場合は、""で括る。% awk '$1 !~ "#"{print}' datafile 読み飛ばしたい行には行頭に#をつけ、#をコメントアウト行と認識させる。 #で始まる行はスキップする。正確には、1列目に#が含まれていなければ出力する。 ~はその列にある文字が含まれている時という条件を表し、 !は直後の条件を否定(not)する。% awk '{printf("%d %f %s\n",$1,$2,$3)}' datafile 出力書式を指定したいときに用いる。 printfの用法はC言語のprintfに準ずる。% awk 'NF >0 {print $1}' datafile 空行をスキップさせる。 NFはawkの変数で、現在読み込んでいる行の列(フィールド)の数を表す。% awk '{if ($1 == "B" || $1 == "N") print "B"; else print "C"}' datafile if/else文。複雑な条件文を組み込む。 if文以下の||は「または」(or)を表す。「かつ」(and)は&&。% awk '{if ($1 !~ "#") if ($1 == 0 && $2 == 0) print $0,0.5,"r"; else print $0,$1/($1+$2); else print "# is escaped."}' datafile 同じくif/else文。二重に入れ子になっているとき。 上記の例は二行に分けてあるが、実際は一行につなげて書く。% awk 'NR==1{s0=$1 } NR!=1{r=$1-s0; s0=$1; print r}' datafile 前後の行での処理。例は、1列目において、1行前の値を今の行の値から引いて出力する。 1行目では今の値を保持させるのみとし、2行目以降で引き算を行っている。 NRはNFと同様にawkの変数で、処理をした行の数を表す。 s0というのは、自分で設定した変数。ここに前の行の一列目の値を保持させている。awk内の変数を挙げる。
- NF :列の数
- NR :行の数。
- FILENAME :今読み込んでいるファイルの名前
basename
- ファイル名からディレクトリと拡張子を取り去る
ファイル名からディレクトリ名を取り去りたいときは
% basename /home/hoge/Data/2000/01/aaa.dat aaa.datファイル名からディレクトリ名と拡張子も取り去りたいときは% basename /home/hoge/Data/2000/01/aaa.dat .dat aaa
cat
- ファイルの中身を表示する(正確には標準出力へ渡す)
単純に、あるファイルの後ろに別のファイルを入れる場合
% cat file1 file (>outfile) カッコ内はファイルに結果をセーブする場合
expand
- タブ文字を空白文字に変換
file
- ファイル種別の判別
head
- ファイルの先頭から#行めかまでをみる
% find -# FILENAME
join
- 2つのファイルを、ある列を介して結合する
例 ファイル1 ファイル2 1 1.2 1 2.4 2 2.9 2 3.1 3 7.4 3 0.2という二つのファイルがあったとする。 このとき、両ファイルの第1列は同じ値である(1,2,3)。 この列を利用して、二つのファイルを結合する。この列はキーと呼ばれる。 つまり、キー(同じ値)を利用して、列を結び付けてファイルを結合する。
% join -j1 1 -j2 1 -o 1.1 1.2 2.2 FILE1.dat FILE2.datファイル1の1列目とファイル2の1列目が一致する行同士を結合し、 ファイル1の1列目、ファイル1の2列目、ファイル2の2列目を標準出力する。 キーは、二つのファイルにおいて桁数が一致しないといけない。 そのため、必要に応じて頭や尾にに0をつける (2.3を02.3、5.4を5.400とするように→awk)。 ファイルの代わりに標準入力を使用するときは、第一ファイルを-とする。
mpage
- ファイルを印刷する
オプション
- -1, -2, -4, -8 :数字の数だけ一枚の紙を分割して印刷(数字の数だけ一枚の数にシートを載せる)
- -l :landscape
ランドスケープだと、1シートはデフォルトで 132 キャラクター、55 行の長さ
ポートレートだと1シートはデフォルトで 80 キャラクター、66 行の長さ- -L :1シート当たりに印刷する行数を指定
- -W :1シート当たりの幅を文字数で指定
- -j1-10 :最初の10シートを選択
- -H :へッダ
- -f :折り返し
- -m60l :60ポイント左端を空ける(穴パンチ時などに便利)
-m60r :lをrにすれば、右端を空ける例 % mpage -1 -l -W200 -P FILENAME 一枚の紙に横向きで0.66倍に縮小して印刷
paste
- ファイルを行方向に単純に結合する
% paste file1 file2でfile1とfile2を結合する。例 file1 file2 0 5 0.1 4 1 8 0.2 3 0.3 9というデータであれば、% paste file1 file2 0 5 0.1 4 1 8 0.2 3 0.3 9と出力される。
sed
- ファイル内の文字を置換する
sed 's/(置換前の文字)/(置換後の文字)/g'
例1 % sed 's/,/:/g' filename.dat とすると、filename.datの中の「,」が「:」に置換される。「/」自体を置換したい場合は、直前に\(バックスラッシュ)をつける。 これはエスケープ文字である。例2 % sed 's/\//:/g' filename.dat とすると、filename.datの中の「/」が「:」に置換される。
tail
- ファイルの先頭(+)尾部(-)から#行めまでをみる(headよりtailの方が高機能)
% tail +# FILENAMEheadとtailの組み合わせ% head +5 FILENAME | tail -3で、ファイルの先頭を5行切出し、パイプしてそのうちの後ろから3行までを出力。
tar
- 複数ファイルやディレクトリを一つのファイルにまとめる
例えば、カレントディレクトリの全てのファイルを固める時は、
% tar cvf aaa.tar ./*tarの次のcvfが固めるときにつけるオプション。なお、下記のようにzを付けると、圧縮もいっぺんにやることができる。% tar cvfz aaa.tar ./*元に戻す時は、% tar xvf aaa.tar% tar xvfz aaa.tar.gzzを付けると、解凍もいっぺんにやることができる。
wc
- ファイルの行数、バイト数、単語数をカウント
% wc filename --lines :行数 % wc filename --bytes :バイト数 % wc filename --words :単語数
xwd
- X windowのダンプ
% xwd > filenameと打つと、マウスカーソルが変化し、クリックしたウインドウをファイルに落とすことができる。画面全体のダンプは、
% xwd -root > filenameである。応用として、画面に出ている任意のウインドウを印刷する方法を記す。
% sleep 2;xwd -root > temp.xwd ; gimp temp.xwd ; rm temp.xwdgimpは画像処理ソフトである。gimpの代わりにxvでもよい。 上記のコマンド群により、gimpやxvに絵が取り込まれるので、これらのソフトから印刷すればよい。最初に「sleep 2」とあるのは、このコマンドにより2秒間稼げるので、その間に印刷したいウインドウを前面に出しておくことができる。