2016-07-28 66 views
0

相關問題是hereawk初學者試圖瞭解awk「思維過程」

我有兩個文件:

文件1:

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

文件2:

line 1 
line 2 

在執行了:

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 
I am a cat 
I am a dog 
I am a dog 
line 2 
I am a cat 
I am a dog 

我在上面的代碼AWK的認識:從文件1

讀行,如果catfile 2存在印刷生產線和1末告訴awk也從file 1打印線。如果沒有找到cat,awk將從file 2中打印任何內容,但仍將打印file 1的相應行。

看上去正在發生的是awk讀取file 1的第一行,找到cat並打印出第一行file 2。然後awk interperets 1作爲一個真實的給定的條件,並再次打印從file 2的第一行。當awk沒有找到cat它作爲一個真正的1 interperates從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 

這是怎麼回事?感謝您的時間。

+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 

當線路I am a cat被處理時,它匹配/cat/。這樣的行動就是這樣進行的。該操作從file2中讀取記錄,該記錄取代當前的$0line 1。然後,第二條規則觸發,它由1組成。 1是一個總是爲真的表達式,所以它匹配任何記錄。它沒有任何操作,因此默認操作是打印。因此,當前記錄被打印,並且您再次看到line 1

第二次出現cat導致line 2正在打印。語法getline保留與其關聯的開放流,以便對相同的getline表達式的多個評估讀取連續的行。出於與上述相同的原因,打印兩次line 2

在第二個示例中,您使用的是讀入指定變量名稱的getline語法變體。因此,它並沒有取代目前的紀錄。當評估1規則時,當前記錄仍爲I am a cat,因此將會打印,而不是line 1line 2