Otázka v těle
Vyberte řádky, které začínají 1
a za nimi následuje mezera
grep -c '^1\s' file
grep -c '^1[[:space:]]' file
To také poskytne počet linek (aniž byste museli volat na wc)
Otázka v nadpisu
A 1
ne následuje další číslo (nebo nic):
grep -cE '^1([^0-9]|$)' file
Ale obě výše uvedená řešení mají několik zajímavých problémů, čtěte dál.
V těle otázky uživatel tvrdí, že soubor je "oddělovaný tabulátory".
Oddělovač
karta
Řádek začínající 1
následuje karta (skutečná karta v příkazu). To se nezdaří, pokud je oddělovačem mezera (nebo jakákoli jiná nebo žádná):
grep '^1 ' file
mezera
Řádek začínající 1
následuje mezera (skutečná mezera v příkazu). Toto selže, pokud je oddělovač jakýkoli jiný nebo žádný.:
grep '^1 ' file
tabulátor nebo mezera
grep '^1( | )' file
grep '^1[[:blank:]]' file
mezera
Flexibilnější možností je vložit několik mezer (horizontálních a vertikálních) znaků. [:space:]
sada znakových tříd se skládá z (mezera),
\t
(horizontální karta), \r
(návrat vozíku),\n
(nový řádek), \v
(svislá karta) a \f
(zdroj formuláře). Ale grep nemůže odpovídat novému řádku (je to interní omezení, kterému se lze vyhnout pouze pomocí -z
volba). Je možné jej použít jako popis na oddělovači. Je také možné, a to je kratší, použít GNU dostupnou zkratku \s
:
grep -c '^1[[:space:]]` file
grep -c '^1\s' file
Tato možnost však selže, pokud je oddělovač něco jako dvojtečka :
nebo jakýkoli jiný interpunkční znak (nebo jakékoli písmeno).
Hranice
Nebo můžeme použít přechod z číslice na hranici „není číslice“, tedy vlastně „znak mimo [_[: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).
To bude akceptovat jako platné řádky, které začínají 1 a po kterých následuje nějaký interpunkční znak.
Zní to, že chcete jen toto:
$ grep '^1\b' a
1 TGCAG.....
1 TGCAG......
Pro tuto část:
$ grep -c '^1\b' file
2
S awk
:
awk '$1 == "1" { print; x++ } END { print x, "total matches" }' inputfile