Die Frage im Körper
Wählen Sie Zeilen aus, die mit 1
beginnen und gefolgt von einem Leerzeichen
grep -c '^1\s' file
grep -c '^1[[:space:]]' file
Das ergibt auch die Anzahl der Zeilen (ohne den Aufruf von wc zu benötigen)
Die Frage im Titel
Eine 1
nicht gefolgt von einer anderen Zahl (oder nichts):
grep -cE '^1([^0-9]|$)' file
Aber beide oben genannten Lösungen haben einige interessante Probleme, lesen Sie weiter.
Im Hauptteil der Frage behauptet der Benutzer, dass die Datei "tabulatorgetrennt" ist.
Trennzeichen
Tab
Eine Zeile, die mit einem 1
beginnt gefolgt von einem Tabulator (ein tatsächlicher Tabulator im Befehl). Dies schlägt fehl, wenn das Trennzeichen ein Leerzeichen ist (oder irgendein anderes oder keins):
grep '^1 ' file
Leerzeichen
Eine Zeile, die mit 1
beginnt gefolgt von einem Leerzeichen (ein tatsächliches Leerzeichen im Befehl). Dies schlägt fehl, wenn das Trennzeichen ein anderes oder keins ist.:
grep '^1 ' file
Tab oder Leerzeichen
grep '^1( | )' file
grep '^1[[:blank:]]' file
Leerzeichen
Eine flexiblere Option besteht darin, mehrere Leerzeichen (horizontal und vertikal) einzuschließen. Die [:space:]
Zeichenklassensatz besteht aus (Leerzeichen),
\t
(horizontaler Tabulator), \r
(Wagenrücklauf),\n
(Zeilenumbruch), \v
(vertikaler Tabulator) und \f
(Formular-Feed). Aber grep kann nicht mit einem Zeilenumbruch übereinstimmen (es ist eine interne Beschränkung, die nur mit -z
umgangen werden könnte Möglichkeit). Es ist möglich, es als Beschreibung für das Trennzeichen zu verwenden. Es ist auch möglich und kürzer, die von GNU verfügbare Abkürzung von \s
zu verwenden :
grep -c '^1[[:space:]]` file
grep -c '^1\s' file
Diese Option schlägt jedoch fehl, wenn das Trennzeichen so etwas wie ein Doppelpunkt :
ist oder ein anderes Satzzeichen (oder ein beliebiger Buchstabe).
Grenze
Oder wir können den Übergang von einer Ziffer zu einer „keine Ziffer“-Grenze verwenden, eigentlich „ein Zeichen, das nicht in [_[:alnum:]]
enthalten ist (_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).
Dies akzeptiert als gültige Zeilen, die mit einer 1 beginnen und von einem Satzzeichen gefolgt werden.
Klingt so, als wollten Sie nur das:
$ grep '^1\b' a
1 TGCAG.....
1 TGCAG......
Für den zählenden Teil davon:
$ grep -c '^1\b' file
2
Mit awk
:
awk '$1 == "1" { print; x++ } END { print x, "total matches" }' inputfile