シェルスクリプトマガジン

AWKでデジタル信号処理(Vol.79掲載)

著者:斉藤 博文

プログラミング言語「AWK」は、データストリーム(データの流れ)を逐次処理するのに適しています。本連載では、電子回路の分野でその特徴を生かし、シェルスクリプトを組み合わせてデジタル信号を処理します。第1回は「デジタルフィルタ」と「リングバッファ」について解説します。

シェルスクリプトマガジン Vol.79は以下のリンク先でご購入できます。

図14 1~10000の出力データから末尾の10行を取り出すAWKプログラム(tail.awk)

#! /usr/bin/gawk -f

{
    lines[NR] = $0;
}

END {
    for (i = NR - 9; i <= NR; i++) {
        print lines[i];
    }
}

図15 リングバッファを用いたAWKプログラム(tail_ring.awk)

#! /usr/bin/gawk -f

BEGIN {
    len = 10;
}

{
    idx = NR % 10;
    buf[idx] = $0;
}

END {
    for (i = 9; i >= 0; i--) {
        print get_buf(buf, idx - i, len);
    }
}

function get_buf(buf, idx, len) {
    if (idx < 0) {
        return buf[idx + len];
    } else {
        return buf[idx];
    }
}

図17 「get_buf」関数をPythonのプログラムで記述

def get_buf(buf, idx, len):
    if (idx < 0):
        return buf[idx + len]
    else:
        return buf[idx]