Você precisa usar operador de correspondência ~ , não operador de subtração - :
$ awk '$2 ~ /^2$/' file
ou use o operador de igualdade ==
como a resposta do @glenn jackman .
Mas vamos dar uma olhada em sua solução anterior, para explicar por que você tem todas as linhas.
awk '$2 - /^2$/ {print}' numbers.txt
Aqui, com cada entrada de linha, se a expressão $2 - /^2$/
for verdadeira, você imprimirá esta linha, senão não fará nada. Como você tem todas as linhas, parece que a expressão $2 - /^2$/
sempre foi avaliada como verdadeira.
Como awk
avaliou essa expressão?
Quando você usa o operador de subtração, o resultado do tipo é numérico. $2
variable era um número, mas /^2$/
é uma expressão regular, qual é o seu valor numérico?
Bem, da documentação do POSIX awk :
When an ERE token appears as an expression in any context other than as the right-hand of the '˜' or "!˜" operator or as one of the built-in function arguments described below, the value of the resulting expression shall be the equivalent of:
$0 ˜ /ere/
Então, seu programa awk
se torna:
awk '$2 - ($0 ~ /^2$/) {print}' numbers.txt
Você pode ver que cada linha de entrada será verificada com a expressão regular /^2$/
. Como nenhuma das suas linhas de entrada corresponde, o resultado da expressão $0 ~ /^2$/
será 0.
Com sua entrada, todos os segundos campos têm valor maior que 0 (subtraia para 0, mantenha-o inalterado), que são o valor verdadeiro em awk
. Portanto, a expressão $2 - /^2$/
é sempre verdadeira, porque awk
imprime todas as linhas.