1フィールドの内容に基づいてawk選択を作成するには?

1フィールドの内容に基づいてawk選択を作成するには?

2番目のフィールドが「2」のすべてのレコードを選択するにはどうすればよいですか?

私のデータは次のとおりです

$ cat numbers.txt 
1 2 3 4 5 6 7 8
2 4 6 8 10 12 14 16
3 6 9 12 15 18 21 24

私のawkは次のようになります

 awk '$2 - /^2$/ {print}' numbers.txt 

しかし、最初の行だけでなく、すべての行を取得します。

1 2 3 4 5 6 7 8
2 4 6 8 10 12 14 16
3 6 9 12 15 18 21 24

答え1

使用する必要がありますマッチ演算子〜、いいえ減算演算子 -:

$ awk '$2 ~ /^2$/' file

または同じ==演算子を使用してください。@Glenn Jackmanの返信

しかし、すべての行を取得する理由を説明するために、以前の解決策を見てみましょう。

awk '$2 - /^2$/ {print}' numbers.txt

ここで、各入力行に対して式が$2 - /^2$/true の場合はその行を印刷し、そうでなければ何もしません。すべての行を取得するので、式は常に$2 - /^2$/trueと評価されているようです。

この表現を評価する方法はawk

減算演算子を使用する場合、結果の型は数値です。$2変数は数値ですが、/^2$/正規表現です。その値は何ですか?

まあ、POSIX awk ドキュメント:

EREトークンが「~」または「!~」演算子の右側以外のコンテキストで式として発生する場合、または後述の組み込み関数のいずれかの引数として発生する場合、結果式の値は次のようになります。次のようになります。

$0 ~ /ere/

したがって、awkプログラムは次のようになります。

awk '$2 - ($0 ~ /^2$/) {print}' numbers.txt

正規表現を使用して各入力ラインを確認することができます/^2$/。一致する入力行がないため、式の結果は$0 ~ /^2$/ゼロになります。

入力した内容に基づいて、すべての2番目のフィールド値は0より大きいです(同じままにするには0を減算します)。したがって、awk$2 - /^2$/は常にtrueなので、awkすべての行が印刷されます。

答え2

~はパターン一致演算子ではありません-。ただし、同等性をテストするには、同等演算子を使用します。==

awk '$2 == 2' numbers.txt

関連情報