Awk: potriviți șirul exact în linia

Am acest fișier

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

Și eu doriți să potriviți șirul exact 200 folosind awk. Deci rezultatul meu ar trebui să fie

a deiauk Biking US 200 G 

Aici este codul meu

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

Dar după că am toate liniile.

Comentarii

  • De ce vă așteptați ca codul dvs. awk să imprime un o singură linie? V-ați deranjat chiar să înțelegeți ce ar trebui să faceți acest lucru?
  • Awk-ul dvs. va imprima i) de câte ori ați văzut acest primul câmp în care penultimul câmp este 200; ii) primul câmp și iii) penultimul câmp. De ce v-ați aștepta ca acesta să tipărească întreaga linie? Ce rezultat obțineți de fapt?

Răspuns

Deoarece doriți o potrivire exactă, de ce să nu folosiți ==?

$ 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 

De asemenea, puteți restrânge potrivirea cu /^200$/:

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

Editați:

Am încercat comanda dvs. și ar trebui să funcționeze. Sunteți sigur de -F " "?

Com ents

  • Da -F ' ' este bine în ituarea mea. Nu ' nu știu de ce, dar mai am aceeași problemă

Răspunde

Cu awk, doar:

awk "$0~/ 200 /" file 

Sau sed (\s se potrivește cu orice spațiu alb):

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

A grep soluție (-P pentru regex perl):

grep -P "\s200\s" file 

Dacă trebuie să fie pur bash:

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

Dacă nu sunteți sigur dacă există spații, file, orice ([[:space:]] este ca \s, în soluțiile sed și grep de mai sus ):

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

Comentarii

  • În grep va funcționa și fără -P, de asemenea, grep '\s200\s' file

Răspuns

Cred că asta va ajuta. Aceasta va imprima doar linia care conține modelul. În cazul dvs., modelul este 200

grep "200" file-name 

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *