2013-03-26 34 views
7

in awk

1 tolower($1) ~ /mary/ { print "CI Record: " $0; } 
2 $0 !~ /Mary/ { print "Not Mary: " $0; } 
3 $1 == "Mary" { print "Mary Record: " $0; } 

爲什麼比較使用$013$12

+4

你甚至不應該考慮使用awk,除非你可以輕鬆地回答這些問題,因爲它們是絕對基本的。這就像向我們展示數學問題並詢問「+」是什麼意思。獲得有效的Awk編程,第三版作者:Arnold Robbins。 – 2013-03-26 22:27:28

+0

同意@EdMorton。順便說一下,我正在投票重新提出這個問題:它的標題引發了很多訪問,並且一個合適的答案和一個好的解釋可以讓這個主題更加清晰。 – fedorqui 2017-01-30 10:14:39

回答

7

其實例如# 2使用,因爲這句法

/regex/ 

在你的例子,如果文字文本Mary沒有全線($0)隨處可見然後執行awk的代碼是指的正則表達式。

$1 == "Mary"正在直接比較文字文本Mary和字段#1($1)。

最後tolower($1) ~ /mary/再次使用關於字段#1 ignre情況正則表達式匹配,這意味着如果$1具有文本mary(忽略情況),則執行AWK代碼的其餘部分。

17

在awk中,$0是參數的整行,而$1只是空格分隔的參數列表中的第一個參數。所以如果我通過awk把「瑪麗有一隻小羊羔」,$1是「瑪麗」,但$0是「瑪麗有一隻小羊羔」。第二行試圖在給awk的整行中找到子字符串「Mary」。

2

從在您的鏈接的描述(重點煤礦):

表達通常是任一字段或 的操作上的字段中的一個的結果中的一個。例如,下面的AWK 過濾規則顯示,分別,如何在不區分大小寫的方式比較第一場到 「瑪麗」,如何搭配所有記錄那些 不包含「瑪麗」 ,以及如何做第一 場反對「瑪麗」的精確比較:

所以它分解:

第一招:

how to compare the first field to 「mary」 in a case-insensitive fashion 

因爲它比較第一場,它採用$1

如何搭配不包含「瑪麗」中的所有記錄,

,因爲它是比較所有記錄,它使用$0

第三個

和怎麼做對「瑪麗」第一場的精確對比:

第一場再次進行比較,所以它的使用$1