Awk: corresponde a string exata na linha

2

Eu tenho este arquivo

a deiauk Biking US 200 G
b kespaul 202 A
c deiauk NY 222 5 Z

E quero corresponder a string exata 200 usando awk . Então meu resultado deve ser

a deiauk Biking US 200 G

Aqui está o meu código

awk -F ' ' '{if($(NF-1) ~ /200/){a[$1]++}}END{for (var in a){print a[var] " " var " " $(NF-1)}}' file.txt

Mas depois disso eu tenho todas as falas.

    
por user3334375 02.06.2015 / 10:00

3 respostas

3

Como você deseja uma correspondência exata, por que não usar == ?

$ cat >file
a deiauk Biking US 200 G
b kespaul 202 A
c deiauk NY 222 5 Z
a auie auie 200 B
b nrst nrst 200 C

$ awk '$(NF-1)==200{a[$1]++}END{for (v in a){print  v,a[v]}}' file
a 2
b 1

Você também pode restringir sua correspondência com /^200$/ :

$ awk '$(NF-1)~/^200$/{a[$1]++}END{for (v in a){print  v,a[v]}}' file
a 2
b 1

Editar:

Eu tentei o seu comando e ele deveria funcionar. Tem certeza do seu -F ' ' ?

    
por 02.06.2015 / 10:08
2

Com awk , apenas:

awk '$0~/ 200 /' file

Ou sed ( \s corresponde a qualquer espaço em branco):

sed -n '/\s200\s/p' file

Uma solução grep ( -P para perl regex):

grep -P '\s200\s' file

Se tiver que ser puro bash :

while read a; do [[ $a =~ " 200 " ]] && echo $a; done <file

Se você não tiver certeza se há espaços, guias, seja qual for ( [[:space:]] é como \s , nas soluções sed e grep acima):

while read a; do [[ $a =~ [[:space:]]200[[:space:]] ]] && echo $a; done <file
    
por 02.06.2015 / 10:39
0

Eu acho que isso vai ajudar. Isso imprimirá apenas o padrão contendo a linha. No seu caso, o padrão é de 200

grep '200' file-name
    
por 14.11.2015 / 18:37

Tags