各行ごとにコマンドを実行するスクリプト
各行ごとにコマンドを実行するスクリプトは面白いので 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 は十分に注意して使ってください。




