2

for ループで AWK を使用してファイルを作成しようとしていますが、空のファイルが取得されます。AWK が実行されていないようです。ここで間違っていることを教えてください。

$LOG/order_"$id".txt2 つの文字列などの間にいくつかの行があるファイルがありCUT:1ます。CUT2これらの行が別のファイルに必要なだけなので、これをループ用に記述しました。

for (( i=1; i<=$CNTLN; i++ ))
do
    j=`expr $i - 1`
    /usr/bin/awk '/CUT:$j/, /CUT:$i/' $LOG/order_"$id".txt >  $LOG/order_"$id"_"$i".txt
done

これにより空のファイルが生成されますが、シェルでこのコマンドをコピーして貼り付けると機能します。

お知らせ下さい。

4

1 に答える 1

2

引用は正しいですが、AWK スクリプト内にシェル変数を埋め込もうとする代わりに、変数の受け渡しを使用する必要があります。

for (( i=1; i<=CNTLN; i++ ))
do
    (( j = i - 1 ))
    /usr/bin/awk -v i="$i" -v j="$j" '$0 ~ "CUT:" j, $0 ~ "CUT:" i' "$LOG/order_$id.txt" >  "$LOG/order_${id}_$i.txt"
done

AWK 変数を使用する場合は、スラッシュ区切り形式の代わりにチルダ一致演算子を使用する必要があります。

使用しているシェルはわかりませんが、その説明に基づいて、forBash、Korn、または Z シェルを推測します。exprそれらのいずれかである場合は、外部ユーティリティを使用せずに、私が示したように整数演算を実行できます。ksh や zsh の場合は、float 演算も実行できます。

計算する行を削除して、ステートメントjに含めることができます。for

for (( i=1, j=0, i<=CNTLN; i++, j++ ))

いくつかの場所で、すべて大文字の変数名を使用しています。シェルまたは環境変数との名前の競合を避けるために、これを行わない習慣をつけることをお勧めします。この特定のケースでは問題ではありませんが、良い習慣です。

実は、今考えてみれば。シェル ループを削除して、すべてを AWK で記述できます。

于 2012-04-26T03:22:32.870 に答える