23

たとえば、このawkチュートリアルには3つの例があります。

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

3 に答える 3

42

awkでは、$0は引数の行全体ですが、は$1スペースで区切られた引数のリストの最初の引数にすぎません。つまり、「メアリーは小さな子羊を持っていた」をawkに通す$1と、「メアリー」ですが、$0「メアリーは小さな子羊を持っていた」です。2行目は、awkに指定された行全体でサブストリング「Mary」を見つけようとしています。

于 2013-03-26T21:08:26.043 に答える
13

実際の例# 2では、この構文のために正規表現を使用しています

/regex/

つまり、あなたの例では、文字通りのテキストMaryが行全体()のどこにも見つからない場合は$0、awkコードを実行します。

一方、リテラルテキストとフィールド#1( )$1 == "Mary"を直接比較しています。Mary$1

最後tolower($1) ~ /mary/に、フィールド#1で再びignre-case regex matchを使用しています。これは、$1テキストがmaryある場合(ignore-case)、残りのawkコードを実行することを意味します。

于 2013-03-26T21:06:05.953 に答える
2

あなたのリンクの説明から(私の強調):

式は通常、フィールドの1つ、またはフィールドの1つに対する操作の結果のいずれかです。たとえば、次のAWKフィルタルールは、大文字と小文字を区別せずに最初のフィールドを「mary」と比較する方法「Mary」を含まないすべてのレコードを照合する方法、および「メアリー」に対する最初のフィールド:

だからそれを分解する:

最初の1つ:

 how to compare the first field to “mary” in a case-insensitive fashion

最初のフィールドを比較しているため、$1

「メアリー」を含まないすべてのレコードを照合する方法、

すべてのレコードを比較しているため、$0

三つ目

そして、最初のフィールドを「メアリー」と正確に比較する方法:

最初のフィールドを再度比較するため、を使用してい$1ます。

于 2013-03-26T21:09:08.223 に答える