2016-07-28 13 views
0

関連する質問はhereです。awk beginner awkを理解しようと思った "考えられたプロセス"

awk '/cat/{getline <"file2"; print};1' file1 
line 1 
line 1 
I am a dog 
I am a dog 
line 2 
line 2 
I am a dog 

を私は期待してい::実行時に

line 1 
line 2 

ファイル1:

I am a cat 
I am a dog  
I am a dog 
I am a cat 
I am a dog 

ファイル2

は、私は2つのファイルを持っている

line 1 
I am a cat 
I am a dog 
I am a dog 
line 2 
I am a cat 
I am a dog 

上記のコードでのawkの私の理解:ファイル1から

読むラインは、catが存在する場合、最後にfile 21から印刷ラインもfile 1からのラインを印刷するのawkに指示します。 catが見つからない場合、awkはfile 2から何も印刷しませんが、対応する行はfile 1から印刷されます。

awkがfile 1の最初の行を読み取り、catを見つけて、file 2から最初の行を出力しているように見えます。 awkは1を与えられた条件に合うようにinterperetsし、file 2から最初の行を再び出力します。 awkがcatを見つけられなかった場合、それは1を真と解釈し、file 1から出力されますか?

awk '/cat/{getline this<"file2"; print this};1' file1 
line 1 
I am a cat 
I am a dog 
I am a dog 
line 2 
I am a cat 
I am a dog 

はここで何が起こっている:私はこれを実行すると、私は興味深い発見他

何かがありますか?あなたの時間をありがとう。ラインI am a catが処理される

+0

うまくいけば、これは学問的な質問であり、あなたの質問に実際にスクリプトを使用することを検討していないことを望みます。もしそうなら、http://awk.freeshell.org/AllAboutGetlineを見てください。 –

+0

@Ed Mortonの情報をありがとう。実際にこれを何かのために使っているわけではなく、ただ学びます。 – thecomebackid

答えて

1
awk '/cat/{getline <"file2"; print};1' file1 
line 1 
line 1 
I am a dog 
I am a dog 
line 2 
line 2 
I am a dog 

は、それが/cat/に一致します。そして行動が実行されます。アクションはfile2から現在の$0line 1を置き換えるレコードを読み取ります。次に、2番目のルールが起動します。これは1です。 1は常に真であるため、任意のレコードと一致する式です。アクションはないので、デフォルトのアクションはprintです。したがって、現在のレコードが印刷され、再度line 1が表示されます。

catの2番目の出現では、line 2が出力されます。 getline構文は、それに関連付けられたオープンストリームを保持するため、同じgetline式の複数の評価で連続する行が読み取られます。 line 2は、上記と同じ理由で2回印刷されます。

第2の例では、指定された変数名を読み込むgetline構文バリアントを使用しています。したがって、現在のレコードは置き換えられません。 1ルールが評価されると、現在のレコードはまたはline 2ではなく、I am a catのままです。

関連する問題