2017-04-10 31 views
-1

次のコードを見てください。私の意図は、変数pをアルファベット順にのみ設定することでした。pが数値行で修正されているのはなぜですか?

awk '/^[A-Z]/{p="$0"; print "set p: " $p} 
{print "p: " $p}' <<EOF 
A 
1 
2 
3 
B 
4 
5 
6 
EOF 

プログラムは、私のシステム上で次の出力を生成します。

set p: A 
p: A 
p: 1 
p: 2 
p: 3 
set p: B 
p: B 
p: 4 
p: 5 
p: 6 

pものののみ、アルファベットのラインすべてのラインで、値の変化に設定されています。どうして?

+1

、単純な入力ミスと閉じるように投票。 – tripleee

+0

シェルとawkの構文が混ざり合っています。 awkはシェルではない、それはそれ自身の言語を持つ完全に別のツールです。 Arnold Robbins著、Effective Awk Programming、第4版を読んでください。 –

答えて

3

$pは、数値が変数pに含まれるフィールドを意味します。したがって、pが4の場合、$pは4番目のフィールドを参照します。 Awkの構文をPerlやシェルの構文と混同していると思われます。

(私のMacOSの上で、私はあなたの例のためのawk: illegal field $($0), name "p"を得るが、これは明らかに、実装に依存します。)また、

お知らせこの試みた修正で$0前後に引用符の有無:

sierra$ awk '/^[A-Z]/{p=$0; print "set p: " p} 
{print "p: " p}' <<<$'A\n1\n2\n3\nB\n4\n5\n6' 
set p: A 
p: A 
p: A 
p: A 
p: A 
set p: B 
p: B 
p: B 
p: B 
p: B 
0

@試してみてください。

awk '$0 ~ /[[:alpha:]]/ && val2{print "set p: " val1 ORS val2;val2="";} $0 ~ /[[:alpha:]]/{val1=$0;next} {val2=val2?val2 ORS $0:$0} END{print "set p: " val1 ORS val2}' Input_file 

ラインはアルファベットを持っていると、変数val2のは、その後VAL1の値を現在印刷しているのであれば、ここでチェックし、 val2(val1はアルファベットの値を持ち、val2はアルファベット以外のすべての値を持つ)。現在、行にアルファベットが含まれているかどうかを確認し、次にval1を現在の行に設定し、nextを使用して次のすべての文をスキップします。次に、この条件が満たされない場合は、val2という名前の変数を作成し、その値はそれ自身に連結します。最後のセクションblockではval1とval2の値を出力します。

EDIT:解決策の1つではないライナーフォームを追加することもできます。

awk '$0 ~ /[[:alpha:]]/ && val2{ 
           print "set p: " val1 ORS val2; 
           val2=""; 
           } 
    $0 ~ /[[:alpha:]]/{ 
         val1=$0; 
         next 
         } 
         { 
         val2=val2?val2 ORS $0:$0 
         } 
    END{ 
       print "set p: " val1 ORS val2 
     } 
    ' Input_file 
+2

2ドル記号の削除と比較すると、これはかなり複雑に思えます。 ;-) – ceving

+0

実際に私はOPがなぜ自分のコーディングで$ pの値を使用したかったのか分からなかったので、出力から理解したのは、アルファベットで始まる行の値を取得してから、次。だから私はこれらの条件を書いた。 – RavinderSingh13

0

これを試してみてください -

$ cat f 
A 
1 
2 
3 
B 
4 
5 
6 
$ awk '{for(i=1;i<=NF;i++) if($i ~ /[[:alpha:]]/) {k=$i;print "set p: "k} {print "p: " k}}' f 
set p: A 
p: A 
p: A 
p: A 
p: A 
set p: B 
p: B 
p: B 
p: B 
p: B 
関連する問題