2

以下のawkコマンドを理解するのを手伝ってください:

awk -v var1=$1 -v var2=$2 '$1 ~ var1 && $2 ~ var2; /^var1 var2/' $READ_FILE | awk '{print $3}'

投稿でこのコマンドを見ました:2つの変数をパラメーターとして受け入れ、値を返す awk コマンド

$1 ~ var1 && $2 ~ var2; /^var1 var2/上記のコマンドの「 」の目的は何ですか。

4

2 に答える 2

4

そのはず:

awk -v var1="$1" -v var2="$2" '$1 ~ var1 && $2 ~ var2; /^var1 var2/' "$READ_FILE"

awk 内var1がシェル変数$1var2なり、 になるということ$2です。awk の内部 (一重引用符の内部) にも$1andが$2あり、入力ファイルの各行のフィールド 1 とフィールド 2 を意味します。最初のフィールド ( ) がおよび$1の文字列の正規表現と一致した場合、は 1に評価され、入力ファイルの対応する行が出力されます。var1$2var2$1 ~ var1 && $2 ~ var2

/^var1 var2/行が文字列「var1 var2」で始まる場合、その行を出力することを意味します(おそらくヘッダーを出力することを意味します)...

于 2013-03-19T16:39:43.860 に答える
-1

リンクで指定された目的のためにまだ働いている間。

編集:リンクされたエントリがその間に修正されたようです。

このコマンドは、実際には少し複雑すぎて、(ある程度) 間違っていることさえあります。

line line の$1 ~ var1 && $2 ~ var2; /^var1 var2/意図を理解するには、まず 2 つの重要な事実を理解する必要があります。

  • コマンドが指定されていなくても、パターンが一致awkすると、明示的な print ステートメントがなくても、一致した行全体が出力されます
  • コマンド ラインから指定する場合、複数のパターンを次のように区切る必要があります。;

-vテストするボット パラメータは、スイッチを介して渡されます。1 つは awk 変数var1を取得し、もう 1 つは awk 変数を取得します。var2

$1 ~ var1 && $2 ~ var2最初のフィールドが var1 に保存されている正規表現 (ここでは関連する演算子) と一致し、2 番目のフィールドが var2 に保存されている正規表現と一致するかどうか (これが演算子の使用目的) の両方をテストします。&&~

2 番目のステートメント/^var1 var2/は不要であり、正しくありません。これは、リテラル"var1" で始まり、その後にリテラル文字列 var2 が続く行と一致するためです。

与えられた例では、どのような方法でも一致しないため、それほど害はありませんが、それでも正しくありません。

~同等性を利用するためのテストの代わりに正規表現一致演算子を使用すること==は、提案されたソリューションが追加する別の「不鮮明さ」です。

私の提案は、単に使用することです:

awk -v var1="$1" -v var2="$2" '$1==var1 && $2==var2 {print $3}' your-file-here

フィールド番号3に格納されている値を出力するためだけに、別のパイプを開くことさえ惜しみません。

于 2013-03-19T16:48:19.540 に答える