awk

awk はテキストのパターンマッチ処理に長けたスクリプト言語である。Perl や Python ほどの機能を持たないが、Linux のコマンドのように使えて、ほんの数行の awk スクリプトを書くだけで様々な処理が行える。

awkの基本文法

変数型

awk で使える変数の型には、数値、文字列、連想配列(配列、多次元配列)などがある。関数の定義も行える。awk の配列はすべて連想配列として処理される。例えば arr[1] は、添字が 1 の配列ではなく、1というキーをもった配列と解釈される。

# 数値型
pi = 3.14

# 文字列型
seq = "ACAGTCGATGTCGATC"

# 配列([]内は添字でなく、キーです)
arr[1] = "AGCAGTCTATTTGCA"
arr[2] = "CGATATTAGC"
arr["seq"] = "AGCTAGCTATTTA"

# 多次元配列
arr[1, 1] = 20

基本構文

if, else 文。

# 一致判断
if ($0 == "ATOM") {
  # 処理
}

# 部分文字列のマッチング
if ($0 ~ "SEQRES") {
  # 処理
}

if ($0 == "A") {
  # 処理
} else if ($0 == "B") {
  # 処理
} else {
  # 処理
}

for 文と while 文。


for (i = 0; i < 10; i++) {
  s = s + i
}


i = 10
while (i > 0) {
  s = s + i;
  i--;
}

awk 組み込み変数

awk にはいくつかの組み込み変数が存在する。例えば、現在の処理しているファイルの行数や列数などの情報が組み込み変数に保存されている。

組み込み変数機能
$0ファイル1行(レコード)分の内容。
$n現在の行の、n 番目のカラム(フィールド)のテキスト内容。
RSフィールドの区切り文字。デフォルトは改行文字。
FS1 行のテキストをカラムに分割する際に利用する区切り文字。
OFSFS と同じく区切り文字を表します。OFS は処理結果を出力するときの区切り文字として利用される。
NF現在のカラム数(区切り文字で区切った時にできる列数)
NR現在の行数

awk の応用例(CSV ファイル処理)

CSV ファイルはカンマで規則正しく区切られたファイルであるから、awk を利用して簡単にデータを抽出したり、加工したりすることができる。

data.csv を読み込んで、1 列目と 2 列目の合計を計算して、画面に出力する例。

awk 'BEGIN{FS = ","}{print $1 + $2}' data.csv

data.csv を読み込んで、各列の平均を出力する例。

awk '
  BEGIN{
    FS = ","
  }
  {
    for (i = 1; i <= NF; i++) {
      s[i] += $i
    }
  }
  END{
    for (i = 1; i <= NF; i++) {
      print s[i] / NR
    }
  }' data.csv

各フィールド(列)の絶対値を出力する例。

awk '
   BEGIN{
      FS = ","
   }
   {
      for(i = 1; i <= NF; i++){
         ($i < 0) ? $i = -$i : $i = $i
      }
      print $0
   }
' data.csv

1 列目のデータを、小数 4 桁で表示する例。

awk 'BEGIN{FS=","}{printf("%.4f\n",$1)}' data.csv

awk の応用例(その他)

FASTA や FASTQ ファイルを処理する例。

奇数行の抽出

data.txt ファイル中の奇数行だけを取り出す例。現在の行番号 NR を 2 で割って、その余りが 1 であれば奇数行であるので、以下のように書くことできる。

awk 'NR % 2 == 1' data.txt

FASTQ から FASTA へ変換

FASTQ ファイルに記載されているリードデータは、1 リードに付き 4 行で記述されている。4 行のうち最初の 2 行をそのまま取り出せば FASTA ファイルとなる。次は SRR000001.fq から SRR000001.fa を作成する例である。

awk 'NR % 4 == 1 || NR % 4 == 2' SRR000001.fq | sed -e 's/^@/\>/' > SRR000001.fa

awk で利用できる正規表現

awk(gawk v3.0)でよく利用される正規表現です。

grepsedawk
...
***
^^^
$$$
¥( ¥)¥( ¥)( )
\1 \2 \3\1 \2 \3\1 \2 \3
[ ][ ][ ]
¥{n, m¥}¥{n, m¥}{n, m}
¥{n, ¥}¥{n, ¥}{n, }
¥{n¥}¥{n¥}{n}
\+\++
\??
\|\||