paste コマンドのようなもの

vcat なんてものを作ってみた - あーありがち (2009-06-08) にインスパイヤされて vcat をトリッキーな方法で作ってみました。 上記の URL のものは全てを配列に格納する関係でメモリを大量に消費する可能性があるので、各ファイルにつき 1 つのバッファで処理するようにしてあります。

#! /usr/local/bin/nawk -f
# vcat.awk

BEGIN {
    for (i = 1; i < ARGC; i++) {

        # 全てのファイルの行数が同じであることを想定
        while (getline < ARGV[1] > 0) {
            cont_line = $0;

            for (j = 2; j < ARGC; j++) {
                # ファイルをクローズしないため、次の行が読み込まれる
                # ことを利用している
                getline line[j] < ARGV[j];
                cont_line = cont_line OFS line[j];
            }

            print cont_line;
        }
    }
}

実はかなり良くないコードなので、「トリッキー」と書きましたが、ファイルを故意にクローズさせないことで、それぞれのファイルから 1 行づつ抜き出しています。

$ cat sample1.txt
111
222
333
444
555

$ cat sample2.txt
aaa
bbb
ccc
ddd
eee

$ cat sample3.txt
AAA
BBB
CCC
DDD
EEE

$ nawk -f vcat.awk sample1.txt sample2.txt sample3.txt
111 aaa AAA
222 bbb BBB
333 ccc CCC
444 ddd DDD
555 eee EEE

$ nawk -v OFS=',' -f vcat.awk sample1.txt sample2.txt sample3.txt
111,aaa,AAA
222,bbb,BBB
333,ccc,CCC
444,ddd,DDD
555,eee,EEE

OFS は上記のように直接記述します。

このコード自体は ソートされた複数のCSVファイルを結合するスクリプト - みずぴー日記のようなものを作ろうとして作ったものですが、こちらの方は完成していません。

ちなみに、この vcat は paste コマンドと同じですよね。

$ paste sample1.txt sample2.txt sample3.txt
111 aaa AAA
222 bbb BBB
333 ccc CCC
444 ddd DDD
555 eee EEE

tag_nawk.pngtag_nawk.pngtag_nawk.pngtag_nawk.png