Řešení 1:
sed -n '10000000,10000020p' filename
Mohli byste to trochu urychlit takto:
sed -n '10000000,10000020p; 10000021q' filename
V těchto příkazech volba -n
způsobí sed
k „potlačení automatického tisku vzorového prostoru“. p
příkaz "print[s] aktuální prostor vzoru" a q
příkaz "Okamžitě ukončete [s] skript sed bez zpracování dalšího vstupu...“ Citace jsou z sed
man
stránku.
Mimochodem, váš příkaz
tail -n 10000000 filename | head 10
začíná na desetimiliontém řádku od konce souboru, zatímco váš "střední" příkaz by začínal na deseti milionté od začátku což by bylo ekvivalentní:
head -n 10000010 filename | tail 10
Problém je v tom, že u netříděných souborů s proměnnou délkou řádků bude muset každý proces projít souborem a počítat nové řádky. Neexistuje způsob, jak to zkrátit.
Pokud je však soubor seřazený (například soubor protokolu s časovými razítky) nebo má řádky pevné délky, můžete soubor vyhledávat na základě pozice bajtu. V příkladu souboru protokolu byste mohli několikrát provést binární vyhledávání, jako to dělá můj skript Python zde*. V případě souboru s pevnou délkou záznamu je to opravdu snadné. Stačí hledat linelength * linecount
znaků do souboru.
Řešení 2:
Zjistil jsem následující použití sed
sed -n '10000000,+20p' filename
Doufám, že to bude pro někoho užitečné!
Řešení 3:
Toto je můj první příspěvek zde! Každopádně tohle je snadné. Řekněme, že chcete vytáhnout řádek 8872 ze souboru s názvem file.txt. Zde je návod, jak to udělat:
cat -n soubor.txt | grep '^ *8872'
Nyní je otázkou najít 20 řádků po tomto. Chcete-li toho dosáhnout, musíte provést
cat -n soubor.txt | grep -A 20 '^ *8872'
Pro řádky kolem nebo před viz příznaky -B a -C v manuálu grep.