Qual é uma boa maneira de extrair, digamos, as linhas 20 a 45 de um grande arquivo de texto. Não interativamente, é claro!
command-line
text-processing
Chris Huang-Leaver
fonte
fonte
awk NR==20,NR==45 textfile
funciona também e lê com facilidade.,
operador de intervalo do awk .Ainda mais simples:
O sinalizador -n desativa a saída padrão. O "20,45" aborda as linhas 20 a 45, inclusive. O comando "p" imprime a linha atual. E oq sai depois de imprimir a linha.
fonte
q
comando (tudo a partir de;
) melhorou o desempenho para mim ao extrair uma única linha 26995107 de um arquivo de 27169334 linhas.Esta não é uma resposta, mas não pode publicá-la como um comentário.
Outra maneira (muito rápida) de fazer isso foi sugerida por mikeserv aqui :
Usando o mesmo arquivo de teste aqui e o mesmo procedimento, aqui estão alguns parâmetros de referência (extração das linhas 1000020-1000045):
mikeserv :
Stefan :
Essas são, de longe, as soluções mais rápidas e as diferenças são insignificantes (para uma única passagem) (tentei com diferentes faixas: algumas linhas, milhões de linhas, etc.).
Fazer isso sem o cano pode oferecer uma vantagem significativa, no entanto, para um aplicativo que precisa procurar em vários intervalos de linhas da mesma maneira, como:
... que imprime ...
... e lê o arquivo apenas uma vez.
As outras
sed
/awk
/perl
solutions leem o arquivo inteiro e, como se trata de arquivos enormes, eles não são muito eficientes. Joguei algumas alternativas queexit
ouq
uit após a última linha no intervalo especificado:Stefan :
vs.
dkagedal (
sed
):vs.
Steven D :
vs.
fonte
awk NR==1000020,NR==1000045 textfile
em seu sistema.fonte
python -c 'import fileinput, sys; [sys.stdout.write(line) for nr, line in enumerate(fileinput.input()) if 19 <= nr <= 44]'
também? :-P Isso é algo que Ruby, modelado após o Perl, inspirado no awk / sed, pode fazer facilmente.Como sed e awk já foram usados, aqui está uma solução perl:
Ou, como apontado nos comentários:
fonte
perl -ne'print if 20..45' textfile