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




