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
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
grepva 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
awksă imprime un o singură linie? V-ați deranjat chiar să înțelegeți ce ar trebui să faceți acest lucru?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?