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 -n
significanãoimprima cada linha por padrão. -e
significa 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 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 começando na linha 10 e head -n 91
imprime as primeiras 91 linhas dele (até e incluindo a linha 100 do arquivo original). É redirecionado para output.txt
da 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 src
e o arquivo para o qual você deseja mover as linhas seja dest
. Se dest
ainda não existir, você o criaria:
touch dest
Em seguida, abra ambos src
e dest
em vim
(a -p
flag 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: 101
seleciona o início da 101ª linha (captura \n
no 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 NR
variá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 src
e então seu shell redireciona a saída para dest
.
Responder4
Você pode fazer isso de várias maneiras.
Uma awk
solução:
$ awk 'NR<10{next};1;NR>100{exit}' file > new_file
Uma perl
solução:
$ perl -nle '
print if $. > 9 and $. < 101;
exit if $. > 100;
' file > new_file