Awk: samsvar nøyaktig streng i linje

Jeg har denne filen

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

Og jeg ønsker å matche den nøyaktige strengen 200 ved hjelp av awk. Så resultatet mitt skal være

a deiauk Biking US 200 G 

Her er koden min

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

Men etter at jeg har alle linjene.

Kommentarer

  • Hvorfor forventer du at awk -koden skal skrive ut en En linje? Gadd du til og med å forstå hva dette skulle gjøre?
  • Kviken din vil skrive ut i) antall ganger du har sett dette første feltet hvor det nest siste feltet er 200; ii) første felt og iii) nest siste felt. Hvorfor skulle du forvente at det skulle skrive ut hele linjen? Hvilken effekt får du egentlig?

Svar

Siden du vil ha en nøyaktig samsvar, hvorfor ikke bruke ==?

$ 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å begrense kampen din 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øvde kommandoen din, og den skulle fungere. Er du sikker på -F " "?

Comm ents

  • Ja -F ' ' er greit i min handling. Jeg vet ikke ' hvorfor, men jeg har fortsatt det samme problemet

Svar

Med awk, bare:

awk "$0~/ 200 /" file 

Eller sed (\s samsvarer med hvilket som helst hvitt mellomrom):

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

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

grep -P "\s200\s" file 

Hvis det må være rent bash:

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

Hvis du ikke er sikker på om det er mellomrom, faner, hva som helst ([[:space:]] er som \s, i sed og grep løsningene ovenfor ):

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

Kommentarer

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

Svar

Jeg tror dette s vil hjelpe. Dette vil bare skrive ut linjen som inneholder mønster. I ditt tilfelle er mønsteret 200

grep "200" file-name 

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *