本質的に私が望むのは、ディレクトリ内のすべてのテキストファイルに対して非破壊的にawkを実行して結果を取得することです。同じファイル名を持っています別のディレクトリに
つまり、awkを使用してディレクトリ内のすべてのファイルに対して操作を実行し、結果は同じファイル名を持つファイルに対してawkを実行した結果を含むディレクトリです。
f1.txt、f2.txt、およびf3.txtファイルを含むfooディレクトリにあるとします。各ファイルでscript.awkを実行したいので、結果はbar / f1.txt、bar / f2.txt、bar / f3.txtにあります。
答え1
あまりありません。ファイルを繰り返して、ファイル名の前に出力ディレクトリ名を付けます。
outputdir=bar
mkdir -p "$outputdir"
for f in ./*.txt; do
awk -f script.awk < "$f" > "$outputdir/$f"
done
これは、入力ファイルが現在のディレクトリにあり、outputdir
そのディレクトリに相対的であると仮定します。したがって、同じレベルにfoo/
andがある場合は、andを設定する必要があります。bar/
cd foo
outputdir=../bar
それ以外の場合は、入力ディレクトリ名を削除する必要があります$f
。プレフィックス削除拡張は${var#pattern}
ここで機能します。
outputdir=./bar
inputdir=./foo
mkdir -p "$outputdir"
for f in "$inputdir"/*.txt; do
awk -f script.awk < "$f" > "$outputdir/${f#"$inputdir"}"
done
"$outputdir/$(basename -- "$f")"
あるいは、あなたによく知られている同様のものを使用することもできます。 (ディレクトリ名が悪い場合は引用符に注意してください。)
答え2
GNU awkを使用した「内部」編集:
cp -r foo bar &&
awk -i inplace 'script' bar/*
答え3
完全性のためにスクリプトを制御する場合できるここで処理してください。
awk -vout=../bar/ '$2=="cow" {print "moo",$3,$1 > out FILENAME; next} $4!="fox" {print > out FILENAME}' *
しかし、これは一般的に面倒な作業なので、個人的に別の答えを選択します。 〜のようにエドGNU awkを除いて、多少小さい項目を区切り、括弧-v
で囲んでから、変更して呼び出しを追加する必要があります。これはもっと面倒だと思います。 :-(>(out FILENAME)
>>
close(out FILENAME)