タグ

ブックマーク / gauc.no-ip.org (5)

  • AWK Users JP :: gawk で並列処理を行う

    gawk には fork() 関数が用意されているのはご存知ですか? Perl の fork() 関数に似ており、複数の CPU コアを搭載するマシンで多重ループを回すような時には並列処理することができます。 まず、普通の awk スクリプトで多重ループを書いてみます。 #! /usr/local/bin/gawk -f # fork_1.awk BEGIN { max_i = 10; max_j = 1000000; for (i = 1; i <= max_i; i++) { for (j = 1; j <= max_j; j++) { print i * j; } } } つまり 10 x 1,000,000 回のループを回します。 $ gawk -f fork_1.awk > /dev/null gawk -f fork_1.awk > /dev/null 5.72s user 0

  • AWK Users JP :: クリスマスツリーを作る

    unite-xmas-tree - C++ゲームプログラミング, treeコマンドでターミナルにクリスマスツリーを飾る - じゃ、ま、いっか などでクリスマスツリーを作るのが流行っている (?) ようなので、awk でクリスマスツリーを作ってみます。 作り方としては以下のような順番です。 ツリーの元になる連続したスペースでできた文字列を作ります。 文字列の一部を飾りとなる文字で置換します。 両サイドにツリーの形となる斜め線を加えます。 センタリングしてできあがり。 #! /bin/awk -f # xmas_tree.awk BEGIN { width = 76; decoration_list = "J * # A"; for (i = 2; i <= width; i += 2) { leaf = repeat(" ", i); for (j = 1; j <= 5; j++) {

  • AWK Users JP :: ls を作ってみる

    某所で ls に関する話題が出たので、つい awk で ls を作ってみました。 gawk には filefuncs という共有オフジェクトがあり、これをロードすることでファイル情報を取得できることから、ls -l のようなものを作ってみます。 この filefuncs を使うことでファイルの情報を簡単かつ高速に取得することができます。 ただし、UID と GID のままでも良いのですが、ここでは /etc/passwd と /etc/group からユーザー名とグループ名を見てます。 実際のコードは以下のようになります。 #! /bin/gawk -f # ls.awk @load "filefuncs" BEGIN { passwd = "/etc/passwd"; group = "/etc/group"; FS = ":"; while (getline < passwd > 0)

  • AWK Users JP :: 1 年の何分の一かを調べる

    1年の何分の何が終わったかカレンダー - 西尾泰和のはてなダイアリー にインスパイヤされて、awk で 1 年の何分の一かを計算してみます。 純粋に nawk だけでも解けないわけではないのですが、時間を扱う関数が gawk に用意されていますので、これを用いて解きます。 mktime() 関数を用いるとエポック時間に変換できます。 エポック時間を strftime() 関数の第 2 引数に入れることで日時に変換することができます。 #! /usr/local/bin/gawk -f # div_year.awk BEGIN { num_div = ARGV[1] ? ARGV[1] : 10; year = strftime("%Y"); next_year = year + 1; start_epoch = mktime(year " 01 01 00 00 00"); end_epo

  • AWK Users JP :: クロス集計を AWK で

    クロス集計をBash(とawk)だけで実装した話 にインスパイヤされて AWK で作ってみます。 ここでは クロス集計をBash(とawk)だけで実装した話 の資料の P. 5 にある左の表を右の表の形式に変換します。 ここでは以下のような表を準備しました。 $ cat sample.txt User Item Money A Ice 130 A Ice 180 B Juice 120 B Ice 130 I OREO 210 I OREO 210 I OREO 210 ユーザー (User) と商品 (Item) の重複を避けるために連想配列にインデックスと値が同じものを構成しています。 #! /usr/local/bin/gawk -f # table.awk NR > 1 { user[$1] = $1; item[$2] = $2; money = $3; total[$1, $2

  • 1