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