指定行数毎に分割する関数

標準入力を指定行数ごとに分割するプログラム - みずぴー日記 にインスパイヤされて指定行数毎に分割するプログラムを作ってみます。

awk であれば一行野郎でもできそうですが、ここでは関数 split_line() というものを定義してインスパイヤ元に近い用法にしてみました。

#! /usr/local/bin/nawk -f
# split_line.awk
# 指定行数毎に分割する
# usage: nawk -f split_line.awk files

{
    split_line(3, "test-%d.tmp");
}

# split_line():     指定行数毎に出力ファイルを分割する関数
#   in:     分割行数 num
#           出力ファイル名
function split_line(num, file) {

    if (NR % num == 1) {

        if (file_name != "") {
            close(file_name);
        }

        file_name = sprintf(file, int(NR / num));
    }

    print $0 > file_name;
}

gawk などではファイルをオープンしすぎても自動的に close してくれますが、nawk などの awk では close しませんので、適宜 close してやります。

それでは実行してみましょう。

$ seq 100 | nawk -f split_line.awk -

$ ls test-*.tmp
test-0.tmp   test-15.tmp  test-20.tmp  test-26.tmp  test-31.tmp  test-6.tmp
test-10.tmp  test-16.tmp  test-21.tmp  test-27.tmp  test-32.tmp  test-7.tmp
test-11.tmp  test-17.tmp  test-22.tmp  test-28.tmp  test-33.tmp  test-8.tmp
test-12.tmp  test-18.tmp  test-23.tmp  test-29.tmp  test-3.tmp test-9.tmp
test-13.tmp  test-19.tmp  test-24.tmp  test-2.tmp   test-4.tmp
test-14.tmp  test-1.tmp   test-25.tmp  test-30.tmp  test-5.tmp

$ cat test-0.tmp
1
2
3

$ cat test-1.tmp
4
5
6

awk で標準入力を用いるには引数に "-" (マイナス) で指定します。 これは AWK Users JP :: ファイルの先頭にテキストを追加するスクリプト で以前、私が忘れていたものです。

tag_nawk.png tag_nawk.png tag_nawk.png tag_nawk.png