it-swarm-eu.dev

Jak zjistím, kolik řádků textový soubor obsahuje, aniž by se zobrazil?

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?

49
Ivan

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).

76
Kevin

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.
  • The /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.

11
DavidDraughn

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 prints 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.

4
HalosGhost

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.

1
Just a learner

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

0
Pramod Tiwari