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
grepfuncionará sem-Ptambé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
awkimprima 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?