Pytanie w treści
Wybierz wiersze zaczynające się od 1
, po których następuje spacja
grep -c "^1\s" file grep -c "^1[[:space:]]" file
To również poda liczbę linii (bez konieczności wywołania wc)
Pytanie w tytule
A 1
nie , po którym następuje inna liczba (lub nic):
grep -cE "^1([^0-9]|$)" file
Ale oba powyższe rozwiązania mają kilka interesujących kwestii, czytaj dalej.
W treści pytania użytkownik twierdzi, że plik jest rozdzielany tabulatorami.
Separator
tab
Linia rozpoczynająca się wi th a 1
, po którym następuje tabulator (aktualna karta w poleceniu). To się nie powiedzie, jeśli separatorem jest spacja (lub jakakolwiek inna lub żadna):
grep "^1 " file
spacja
Linia zaczynająca się od 1
, po którym następuje spacja (rzeczywista spacja w poleceniu). To się nie powiedzie, jeśli separator jest inny lub żaden:
grep "^1 " file
tabulator lub spacja
grep "^1( | )" file grep "^1[[:blank:]]" file
białe znaki
Bardziej elastyczną opcją jest dodanie kilku znaków spacji (poziomych i pionowych). Zestaw klas znaków [:space:]
składa się z
(spacja), \t
(tabulator poziomy ), \r
(powrót karetki), \n
(nowa linia), \v
(tabulator pionowy ) i \f
(kanał formularza). Ale grep nie może dopasować znaku nowej linii (jest to wewnętrzne ograniczenie, którego można było uniknąć tylko dzięki opcji -z
). Można go użyć jako opisu na separatorze. Możliwe jest również i krótsze użycie dostępnego w GNU skrótu \s
:
grep -c "^1[[:space:]]` file grep -c "^1\s" file
Ale ta opcja nie powiedzie się, jeśli separatorem jest coś w rodzaju dwukropka :
lub dowolnego innego znaku interpunkcyjnego (lub dowolnej litery).
Granica
Lub możemy użyć przejścia od cyfry do granicy „niebędącej cyfrą”, cóż, właściwie „znaku spoza [_[: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).
Zaakceptuje to jako prawidłowe wiersze zaczynające się od 1 i zakończone jakimś znakiem interpunkcyjnym.
Komentarze
Każda z nich wskaże wiersze z 1
w pierwszej kolumnie
awk "$1 == 1" grep -w "^1"
Oba można rozszerzyć, więc nie potrzebujesz nawet wc
do zliczania linii
awk "$1==1 { x++ } END { print x }" grep -cw "^1"
Dobre odpowiedzi tutaj, ale zakładając że nie każda linia kończy się spacją (jak gdybyś poszedł t niektóre, które faktycznie trafiają do twojego „=”), możesz użyć tego:
grep -c "^1[^0-9]" file
Zasadniczo pasuje do każdej linii zaczynającej się od jedynki, po której następuje niecyfrowa, w tym spacja. Nieco bardziej rozwlekły, ale też bardziej niezawodny. (Chociaż warto zauważyć, że nie ma tu nic dla warunku zerowego tylko jeden w wierszu, nie jest on wrażliwy na koniec wiersza.)
Komentarze
Możesz również użyć poniższej linii:
$ awk -F" " "{if($1=="1") print $0}" <your file name> | wc -l
Parametr -F
sprawia, że separator pól jest białą spacją . Jeśli wartość pierwszego pola wynosi „1”, zostanie wydrukowana jego linia.