La domanda nel corpo
Seleziona le righe che iniziano con 1
e sono seguiti da uno spazio
grep -c '^1\s' file
grep -c '^1[[:space:]]' file
Ciò fornirà anche il conteggio delle righe (senza bisogno della chiamata a wc)
La domanda nel titolo
Un 1
non seguito da un altro numero (o niente):
grep -cE '^1([^0-9]|$)' file
Ma entrambe le soluzioni di cui sopra hanno alcuni problemi interessanti, continua a leggere.
Nel corpo della domanda l'utente afferma che il file è "delimitato da tabulazioni".
Delimitatore
scheda
Una riga che inizia con un 1
seguito da una scheda (una scheda effettiva nel comando). Questo fallisce se il delimitatore è uno spazio (o qualsiasi altro, o nessuno):
grep '^1 ' file
spazio
Una riga che inizia con un 1
seguito da uno spazio (uno spazio effettivo nel comando). Questo fallisce se il delimitatore è qualsiasi altro o nessuno.:
grep '^1 ' file
tabulazione o spazio
grep '^1( | )' file
grep '^1[[:blank:]]' file
spazi bianchi
Un'opzione più flessibile consiste nell'includere diversi caratteri di spazio (orizzontali e verticali). Il [:space:]
il set di classi di caratteri è composto da (spazio),
\t
(scheda orizzontale), \r
(ritorno a capo),\n
(nuova riga), \v
(scheda verticale) e \f
(feed modulo). Ma grep non può corrispondere a una nuova riga (è una limitazione interna che potrebbe essere evitata solo con -z
opzione). È possibile utilizzarlo come descrizione sul delimitatore. È anche possibile, e più breve, usare la scorciatoia disponibile in GNU \s
:
grep -c '^1[[:space:]]` file
grep -c '^1\s' file
Ma questa opzione fallirà se il delimitatore è qualcosa come i due punti :
o qualsiasi altro carattere di punteggiatura (o qualsiasi lettera).
Confine
Oppure, possiamo usare la transizione da una cifra a un limite "non una cifra", beh, in realtà "un carattere non in [_[: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).
Questo accetterà come valide le righe che iniziano con un 1 e sono seguite da qualche carattere di punteggiatura.
Sembra che tu voglia solo questo:
$ grep '^1\b' a
1 TGCAG.....
1 TGCAG......
Per la parte di conteggio di questo:
$ grep -c '^1\b' file
2
Con awk
:
awk '$1 == "1" { print; x++ } END { print x, "total matches" }' inputfile