awk メモ

awkはAWKという言語らしいが,ワンライナーとしてしか使ったことがない.

列ごとに値を抽出

下記のようなファイルを仮定する。

## foobar.txt,  $x, $y, $a, $z
x1, y1, a1, z1, 
x2, y2, a2, z2,
x3, y3, a3, z3,
...

この並びのファイルをaの列だけ取り除くには,

awk -F',' 'NR>1 {print $1 $2 $4}' foobar.txt > output.txt

とする.ここで, -F','はセパレータが「,」であること,NRの次の値は読み取りを行わない行数(ヘッダー),${d}はそれぞれの列を表す.

最大値・最小値の抽出

上記のファイル形式で,zの最大値・最小値を抽出することを考える.
全ての行に対して,大小判定を行うようにすればOK.

#初期値(99999)は都合に応じて変更する
#最小値
awk -F',' 'BEGIN{min=99999} {if (min>$4) min=$4} END {printf "%0.1f",min}' foobar.txt >foobarmin.txt 
#最大値
awk -F',' 'BEGIN{max=-99999} {if (max<$4) max=$4} END {printf "%0.1f",max}' foobar.txt >foobarmax.txt

初期値を設定しておかないと,全てが0以上または0以下の場合値を返さないことに注意.
printfで出力のフォーマットも指定できる.

NaNのある行を取り除く(isnan的な)

awkでNaNを検出して,該当する行全体を除いたファイルを作成する.
まず,下記のようなfoobar.datを仮定する.

  1  1  5.000
  1  2  1.000
  1  3    NaN
  2  1  3.000
  2  2    NaN
  2  3  4.000

ここから,3列目にNaNのある行だけ除いて,新たにファイルを作成にはパターンマッチを行う処理を加えて,

awk '!/NaN/{print $0}' foobar.dat > foo.dat

とする.生成されたfoo.datは下記の通り.

  1  1  5.000
  1  2  1.000
  2  1  3.000
  2  3  4.000

NaNのない行だけ抜き出すことができた.


Front page   Edit Diff Attach Copy Rename Reload   New List of pages Search Recent changes   Help   RSS of recent changes
Last-modified: 2018-06-28 (Thu) 19:12:03 (202d)