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
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
awk
să 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?