Awk: match nøjagtig streng i linje

Jeg har denne fil

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

Og jeg ønsker at matche den nøjagtige streng 200 ved hjælp af awk. Så mit resultat skal være

a deiauk Biking US 200 G 

Her er min kode

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

Men efter at jeg fik alle linjer.

Kommentarer

  • Hvorfor forventer du, at din awk -kode skal udskrive en enkelt linje? Gik du engang med at forstå, hvad dette skulle gøre?
  • Din awk vil udskrive i) det antal gange, du har set dette 1. felt, hvor det næstsidste felt er 200; ii) det første felt og iii) det næstsidste felt. Hvorfor skulle du forvente, at det skulle udskrive hele linjen? Hvilket output får du faktisk?

Svar

Da du vil have et nøjagtigt match, hvorfor ikke bruge ==?

$ 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 

Du kan også begrænse din kamp med /^200$/:

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

Rediger:

Jeg prøvede din kommando, og den skulle fungere. Er du sikker på din -F " "?

Comm ents

  • Ja -F ' ' er fint i min ituaktion. Jeg ved ikke ' hvorfor, men jeg har stadig det samme problem

Svar

Med awk, bare:

awk "$0~/ 200 /" file 

Eller sed (\s matcher ethvert hvidt mellemrum):

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

A grep løsning (-P for perl regex):

grep -P "\s200\s" file 

Hvis det skal være rent bash:

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

Hvis du ikke er sikker på, om der er mellemrum, faner, hvad som helst ([[:space:]] ligner \s i sed og grep -løsningerne ovenfor ):

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

Kommentarer

  • I grep det fungerer uden -P også, grep '\s200\s' file

Svar

Jeg tror, at dette s hjælper. Dette udskriver kun linjen, der indeholder mønster. I dit tilfælde er mønster 200

grep "200" file-name 

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *