2012-03-22 9 views
0

のために、私は完璧に動作し、次のawkコマンドがありますように、第1の通り値22、および行のNR:それは何AWK:エスケープ文字を使用して文

awk 'BEGIN { ORS = " " } {print 22, $1, NR; for(i=2;i<=NF;++i) print $i}{print "\n"}' file 

は、2つの列を挿入しています3番目(this question参照)。 私は次のようにforループでは、このコマンドを実行しようとした:

for p in 20 21 22 
do 
awk 'BEGIN { ORS = " " } {print $p, \$1, NR; for(i=2;i<=NF;++i) print \$i}{print "\n"}' file > file$p 
done 

ので、代わりの最初の列22を各ファイルは最初の列として20、21または22を有する場合、3つのファイルが作られています。残念ながら、これはうまくいかず、私はメッセージを受け取ります:^バックスラッシュは行末にありません。 これはおそらく$文字をどのようにエスケープしたかと関係がありますが、他にどのように行うのかわかりません。

答えて

2

あなたは

-v parameter=value 

すなわち、このよう

awk -v p=$p ... 

を使用使用してawkはシェルパラメータを割り当てることができます。

for p in 20 21 22 
do 
awk -v p=$p 'BEGIN { ORS = " " } [TOO LONG LINE]' file > file$p 
done 

完全なコマンド:

for p in 20 21 22; do awk -v p=$p 'BEGIN { ORS = " " } {print p, $1, NR; for(i=2;i<=NF;++i) print $i}{print "\n"}' file > file$p; done 
を3210
2

あなたは正しい方向にあります。あなたのawkスクリプトは '(一重引用符)内にあるので、bashは$ pをスクリプトの値に置き換えません(詳細なBashスクリプティングガイド - 引用を参照)。あなたは、次のいずれかを実行する必要があり : 1(Recommened):

for p in 20 21 22 
do 
awk -v p=$p 'BEGIN { ORS = " " } {print p, \$1, NR; for(i=2;i<=NF;++i) print \$i}{print "\n"}' file > file$p 
done 

2:使用

+0

"\で、' $をエスケープしていない」ではなく 'とawkの中には、エスケープ" 'awkスクリプトで。 –

関連する問題