Awk: coincidir com a string exata na linha

Eu tenho este arquivo

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

E eu deseja corresponder à string exata 200 usando awk. Portanto, meu resultado deve ser

a deiauk Biking US 200 G 

Aqui está 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 que obtive todas as linhas.

Comentários

  • Por que você espera que seu código awk imprima um linha única? Você ao menos se preocupou em entender o que isso deveria fazer?
  • Seu awk imprimirá i) o número de vezes que você viu este primeiro campo onde o penúltimo campo é 200; ii) o primeiro campo e iii) o penúltimo campo. Por que você esperaria que ele imprimisse a linha inteira? Qual saída você está realmente obtendo?

Resposta

Já que 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:

Tentei seu comando e deve funcionar. Tem certeza de seu -F " "?

Comm ents

  • Sim -F ' ' está bem na minha ituação. Eu não ' não sei por quê, mas ainda tenho o mesmo problema

Resposta

Com awk, apenas:

awk "$0~/ 200 /" file 

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

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

A grep solução (-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 tem certeza se há espaços, tabulações, qualquer coisa ([[:space:]] é como \s, nas soluções sed e grep acima ):

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

Comentários

  • Em grep funcionará sem -P também, grep '\s200\s' file

Resposta

Eu acho que s vai ajudar. Isso imprimirá apenas a linha que contém o padrão. No seu caso, o padrão é 200

grep "200" file-name 

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *