データファイル処理に便利なUNIXコマンド

データファイル処理に便利なUNIXコマンド

(一部工事中、順次拡張予定)

ここでは、データファイル処理に便利なUNIXコマンドの紹介を行います。


使用目的から探す - 実例集 -


コマンド名から探す - コマンドリファレンス -


コマンドリファレンス

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 +# FILENAME
headと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.gz
zを付けると、解凍もいっぺんにやることができる。

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.xwd
gimpは画像処理ソフトである。gimpの代わりにxvでもよい。 上記のコマンド群により、gimpやxvに絵が取り込まれるので、これらのソフトから印刷すればよい。

最初に「sleep 2」とあるのは、このコマンドにより2秒間稼げるので、その間に印刷したいウインドウを前面に出しておくことができる。



計算機によるデータ解析入門のページに戻る

野口のTopページに戻る

情報科学科のTopページに戻る