Jak najdu, kolik řádků textový soubor obsahuje, aniž by byl soubor otevřen v editoru nebo v prohlížeči? Existuje šikovný příkaz konzoly Unix k zobrazení čísla?
Opravdu existuje. Říká se tomu wc
, původně pro počet slov, ale může to dělat řádky, slova, znaky, bajty (as některými implementacemi délku nejdelšího řádku v bajtech nebo šířku zobrazení nejširšího) jeden). The -l
volba říká, že má počítat řádky (ve skutečnosti počítá znaky nového řádku, tedy pouze řádky s oddělovači):
wc -l mytextfile
Nebo vydat pouze počet řádků:
wc -l < mytextfile
(pozor, že některé implementace vkládají mezery před toto číslo).
Další možností by bylo použít grep
k nalezení, kolikrát se vzorek shoduje:
grep --regexp="$" --count /path/to/myfile.txt
V tomto příkladu
$
je výraz, který vyhodnocuje nový řádek (stiskne se tlačítko Enter)--count
potlačuje normální výstup zápasů a zobrazuje, kolikrát byla shoda./path/to/myfile.txt
je docela zřejmé, doufám :)EDIT: Jak je uvedeno v komentářích @hesse, lze to zkrátit na
grep -c $ path/to/file
Což by také učinilo standardní a přenosné implementace bez GNU grep
.
Také bych dodal, že je docela snadné to udělat v čistě awk
, pokud jste z nějakého důvodu chtěli nepoužívat wc
.
$ awk 'END { print NR }' /path/to/file
Výše print
s počet záznamů (NR
) přítomných v souboru na /path/to/file
.
Poznámka: Na rozdíl od wc
to nevytiskne název souboru. Pokud byste tedy chtěli pouze číslo, byla by to dobrá alternativa k cat file | wc -l
.
Jak @Kevin navrhl, můžete pomocí příkazu wc
spočítat řádky v souboru. Nicméně, wc -l test.txt
bude ve výsledku obsahovat název souboru. Můžeš použít:
wc -l < test.txt
stačí jen získat počet řádků bez názvu souboru. Pokusit se.
Podle mého testu mohu ověřit, že AWK je mnohem rychlejší než ostatní nástroje (GREP, SED, AWK, Perl, WC)
Tady je výsledek testu, který jsem zde běžel
date +%x_%H:%M:%S; grep -c $ my_file.txt; date +%x_%H:%M:%S;
10/03/16_09: 41: 51 24579427 10/03/16_09: 42: 40 ~ 49 sekund
date +%x_%H:%M:%S; wc -l my_file.txt; date +%x_%H:%M:%S;
10/03/16_09: 35: 05 24579427 my_file.txt 10/03/16_09: 35: 45 ~ 40 sekund
date +%x_%H:%M:%S; sed -n '$=' my_file.txt; date +%x_%H:%M:%S;
10/03/16_09: 33: 50 24579427 10/03/16_09: 34: 29 ~ 39 sekund
date +%x_%H:%M:%S; Perl -ne 'END { $_=$.;if(!/^[0-9]+$/){$_=0;};print "$_" }' my_file.txt; date +%x_%H:%M:%S;
10/03/16_09: 36: 11 24579427 10/03/16_09: 36: 36 ~ 25 sekund
date +%x_%H:%M:%S; awk 'END { print NR }' my_file.txt; date
+%x_%H:%M:%S;
10/03/16_09: 43: 36 24579427 10/03/16_09: 43: 58 ~ 22 sekund