Como basear a seleção do awk no conteúdo de 1 campo?

2

Como posso selecionar todos os registros que têm '2' como segundo campo?

Meus dados são:

$ 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

Meu awk é:

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

mas recebo todas as linhas, não apenas a primeira:

1 2 3 4 5 6 7 8
2 4 6 8 10 12 14 16
3 6 9 12 15 18 21 24
    
por Michael Durrant 30.11.2014 / 19:35

2 respostas

9

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.

    
por 30.11.2014 / 20:25
3

~ é o operador de correspondência de padrão, não - . Mas se você está testando a igualdade, use o operador de igualdade ==

awk '$2 == 2' numbers.txt
    
por 30.11.2014 / 19:44

Tags