各行ごとにコマンドを実行するスクリプト

各行ごとにコマンドを実行するスクリプトは面白いので awk でも作ってみました。 何が面白いかというと、xargs やバッククォートでの処理が awk や Perl のような LL でできれば OS 間の可搬性が良くなります。

作り方は、上記のページの Perl 版と同じようなものですが、awk では引数全て (Perl で言えば @ARGV) という配列全体を扱うことができないため、Perl と比較して長くなってしまいました。

#! /usr/bin/gawk -f
# exec_each_line.awk

BEGIN {
    for (i = 1; i < ARGC; i++) {
        exec_cmd = exec_cmd ARGV[i] " ";
        delete ARGV[i];
    }
}

{
    print exec_cmd $0;    # for debug
    ##system(exec_cmd $0);
}

つまり、awk では配列 ARGV を連接で繋げて system() 関数に渡しています。 安全のために実行部分をコメントにして、デバッグの部分を有効にしてあります。

実行してみましょう。

$ cat dir.txt
foo
bar
buz
$ gawk -f exec_each_line.awk rm -fr < dir.txt
rm -fr foo
rm -fr bar
rm -fr buz

もっとも rm は十分に注意して使ってください。

tag_nawk.pngtag_nawk.pngtag_nawk.pngtag_nawk.png