Como obter linhas de 10 a 100 de um arquivo de 200 linhas para um novo arquivo [duplicado]

17

Eu tenho um arquivo com 200 linhas.

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

Como você faz isso em unix / Linux?

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

    
por sunil 21.06.2014 / 07:54

4 respostas

29

Use sed :

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

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

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

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

Isso significa que excluir as linhas 1-9, sair após a linha 100 e imprimir o resto. Para 200 linhas, isso não vai importar, mas para 200.000 linhas, a primeira versão ainda vai olhar para todas as linhas, mesmo quando nunca vai imprimi-las. Eu 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.

Como alternativa, você pode usar head e tail em combinação:

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

Desta vez, tail -n +10 imprime o arquivo inteiro a partir da linha 10, e head -n 91 imprime as primeiras 91 linhas desse (até e incluindo a linha 100 do arquivo original). Ele é redirecionado para output.txt da mesma maneira.

    
por 21.06.2014 / 08:06
6

Se você fizesse isso em vim , seria bem simples. Suponha que seu arquivo tenha o nome src e o arquivo para o qual você deseja mover as linhas seja dest . Se dest ainda não existir, você deverá criá-lo:

touch dest

Em seguida, abra os dois src e dest em vim (o -p flag abre os argumentos nas guias):

vim -p src dest

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

10ggv101ygtp

Nota : o 101 seleciona para o começo da 101ª linha (pega o \n no final da linha 100).

Esse é obviamente 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 ser um bom caso de uso para awk :

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

A variável NR permite que você combine padrões com o número de linhas. Assim, o comando acima, extrai as linhas 10 a 100 de src e, em seguida, seu shell redireciona a saída para dest .

    
por 21.06.2014 / 08:38
5

Isso deve fazer

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

    
por 21.06.2014 / 08:07
3

Você pode fazer isso de várias formas.

Uma solução awk :

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

Uma solução perl :

$ perl -nle '
    print if $. > 9 and $. < 101;
    exit if $. > 100;
' file > new_file
    
por 21.06.2014 / 09:48