2012-04-26 8 views
2

forループを使用してAWKを使用してファイルを作成しようとしていますが、空のファイルを取得しようとしています。 AWKは実行されていないようです。アドバイスをお願いします、ここで間違っているのは何ですか?シェルスクリプトでAWKコマンドを実行する方法は?

私は2本の文字列CUT:1CUT2などの間にいくつかの行があるファイルを持っています。私はこれをループのために別々のファイルに書くだけです。

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 

これは空のファイルを生成しますが、このコマンドをシェルでコピーして実行すると動作します。

お知らせください。

+2

暗闇で撮影:「/ CUT:$ j ....」の部分を二重引用符で置換してみましたか? – JScoobyCed

+0

素晴らしいです –

答えて

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

あなたはどちらのシェルを使っているのかわからないが、forのステートメントに基づいて、私はBash、KornまたはZシェルを推測するだろう。もしそれらの1つでは、外部のexprユーティリティを使わずに示したように整数演算を行うことができます。 kshやzshの場合、浮動小数点演算もできます。

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

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

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

実際、私はそれについて考えています。シェルループは削除され、AWKで書かれたものです。

関連する問題