Como obter as linhas 10 a 100 de um arquivo de 200 linhas em um novo arquivo

Como obter as linhas 10 a 100 de um arquivo de 200 linhas em um novo arquivo

Eu tenho um arquivo com 200 linhas.

Preciso extrair as linhas de 10 a 100 e colocá-las em um novo arquivo.

Como você faz isso no Unix/Linux?

Quais são os comandos possíveis que você pode usar?

Responder1

Usarsed:

sed -n -e '10,100p' input.txt > output.txt

sed -nsignificanãoimprima cada linha por padrão. -esignifica executar o próximo argumento como um script sed. 10,100pé um script sed que significa começar na linha 10, até a linha 100 (inclusive), imprimir ( p) essa linha. Em seguida, a saída é salva em output.txt.

Se o seu arquivo for maior que o sugerido, esta versão (sugerida nos comentários) será mais rápida:

sed -e '1,9d;100q'

Que significaexcluirlinhas 1-9,desistirapós a linha 100 e imprima o resto. Para 200 linhas isso não fará diferença, mas para 200.000 linhas a primeira versão ainda examinará cada linha, mesmo quando nunca for imprimi-las. Prefiro a primeira versão em geral por ser explícita, mas com um arquivo longo isso será muito mais rápido — você conhece melhor seus dados.

Alternativamente, você pode usar heade tailem combinação:

tail -n +10 input.txt | head -n 91 > output.txt

Desta vez, tail -n +10imprime o arquivo inteiro começando na linha 10 e head -n 91imprime as primeiras 91 linhas dele (até e incluindo a linha 100 do arquivo original). É redirecionado para output.txtda mesma maneira.

Responder2

Isso deveria fazer

tail -n +10 file.txt | head -n 91 > newfile.txt

Responder3

Se você fizesse isso em vim, seria bem simples. Suponha que seu arquivo tenha um nome srce o arquivo para o qual você deseja mover as linhas seja dest. Se destainda não existir, você o criaria:

touch dest

Em seguida, abra ambos srce destem vim(a -pflag abre os argumentos em abas):

vim -p src dest

Pule para a décima linha; selecione tudo da 10ª à 100ª linha; puxão; mude para a guia que contém dest; colar.

10ggv101ygtp

Observação: 101seleciona o início da 101ª linha (captura \nno final da linha 100).


Obviamente, esse é um processo um pouco mais complicado do que usar uma ferramenta de linha de comando, mas tem a vantagem de fornecer uma seleção visual (para que você tenha certeza de obter tudo o que deseja). No entanto, isso também parece um bom caso de uso para awk:

awk 'NR==10, NR==100' src > dest

A NRvariável permite que você faça a correspondência de padrões com o número de linhas. Assim, o comando acima extrai as linhas 10–100 de srce então seu shell redireciona a saída para dest.

Responder4

Você pode fazer isso de várias maneiras.

Uma awksolução:

$ awk 'NR<10{next};1;NR>100{exit}' file > new_file

Uma perlsolução:

$ perl -nle '
    print if $. > 9 and $. < 101;
    exit if $. > 100;
' file > new_file

informação relacionada