Întrebarea din corp
Selectați liniile care încep cu un 1
și sunt urmate de un spațiu
grep -c "^1\s" file grep -c "^1[[:space:]]" file
care va da, de asemenea, numărul de linii (fără a fi nevoie de apelul către wc)
Întrebarea din titlu
A 1
nu urmat de un alt număr (sau nimic):
grep -cE "^1([^0-9]|$)" file
Dar ambele soluții de mai sus au câteva probleme interesante, continuați să citiți.
În corpul întrebării, utilizatorul susține că fișierul este „delimitat de tabulator”.
Delimitator
tab
O linie care începe wi a 1
urmată de o filă (o filă reală din comandă). Acest lucru nu reușește dacă delimitatorul este un spațiu (sau oricare altul sau niciunul):
grep "^1 " file
spațiu
O linie care începe cu un 1
urmat de un spațiu (un spațiu real din comandă). Acest lucru nu reușește dacă delimitatorul este oricare altul sau nici unul:
grep "^1 " file
fila sau spațiu
grep "^1( | )" file grep "^1[[:blank:]]" file
spațiu alb
O opțiune mai flexibilă este de a include mai multe caractere spațiale (orizontale și verticale). Setul de clase de caractere [:space:]
este compus din
(spațiu), \t
(fila orizontală ), \r
(retur de transport), \n
(newline), \v
(tab vertical ) și \f
(feed formular). Dar grep nu se poate potrivi cu o linie nouă (este o limitare internă care ar putea fi evitată numai cu opțiunea -z
). Este posibil să-l folosiți ca descriere pe delimitator. Este, de asemenea, posibil și mai scurt, să folosiți stenograma disponibilă de GNU a \s
:
grep -c "^1[[:space:]]` file grep -c "^1\s" file
Dar această opțiune va eșua dacă delimitatorul este ceva asemănător unui punct :
sau orice alt caracter de punctuație (sau orice literă).
Limită
Sau, putem folosi tranziția de la o cifră la o delimitare „nu o cifră”, de fapt „un caracter care nu se află în [_[:alnum:]]
(_a-zA-Z0-9
) „:
grep -c "^1\b" file # portable but not POSIX. grep -c "^1\>" file # portable but not POSIX. grep -wc "^1" file # portable but not POSIX. grep -c "^1\W" file # portable but not POSIX (not match only a `1`) (not underscore in BSD).
Aceasta va accepta ca linii valide care încep cu 1 și sunt urmate de un anumit caracter de punctuație.
Comentarii
Oricare dintre acestea va alege linii cu un 1
în prima coloană
awk "$1 == 1" grep -w "^1"
Ambele pot fi extinse, astfel încât să nu aveți nevoie de wc
pentru a număra liniile
awk "$1==1 { x++ } END { print x }" grep -cw "^1"
Răspunsuri bune aici, dar presupunând că nu fiecare linie se termină într-un spațiu (ca și cum ai fi plecat Câteva care ajung de fapt la „=”), puteți utiliza acest lucru:
grep -c "^1[^0-9]" file
Practic se potrivește pentru orice linie care începe cu una, urmată de un spațiu fără cifre, inclusiv alb. Un pic mai detaliat, dar și mai infailibil. (Deși este demn de remarcat faptul că nu este nimic aici pentru starea nulă de doar unu-pe-linie, nu este sensibil la sfârșitul liniei.)
Comentarii
Puteți utiliza și linia de mai jos:
$ awk -F" " "{if($1=="1") print $0}" <your file name> | wc -l
Parametrul -F
face separatorul de câmp un spațiu alb . Dacă valoarea primului câmp este „1”, linia acestuia va fi tipărită.