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
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
awk
imprima um linha única? Você ao menos se preocupou em entender o que isso deveria fazer?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?