Como eu removo certas linhas (usando números de linha) em um arquivo?

27

Existem linhas específicas que eu quero remover de um arquivo. Digamos que seja a linha 20-37 e a linha 45. Como eu faria isso sem especificar o conteúdo dessas linhas?

    
por Tshepang 12.04.2011 / 22:48

4 respostas

29

Com sed , assim:

sed '20,37d; 45d' < input.txt > output.txt

Se você quiser fazer isso no local:

sed --in-place '20,37d; 45d' file.txt
    
por 12.04.2011 / 23:00
5

Se o arquivo couber confortavelmente na memória, você também pode usar ed .
Os comandos são bastante semelhantes ao sed um acima com uma diferença notável: você tem que passar a lista de números de linhas / intervalos a serem excluídos em ordem decrescente (da maior linha não / intervalo para o mais baixo). O motivo é que quando você exclui / insere / divide / associa linhas com ed , o buffer de texto é atualizado após cada subcomando, portanto, se você excluir algumas linhas, as outras linhas seguintes não estarão mais na mesma posição buffer quando o próximo subcomando é executado. Então você tem que começar para trás 1 . edição:

ed -s in_file <<IN
45d
20,37d
w
q
IN

ou

ed -s in_file <<< $'45d\n20,37d\nw\nq\n'

ou

printf '%s\n' 45d 20,37d w q | ed -s in_file

Substitua w rite por ,p rint se quiser imprimir a saída resultante em vez de gravar no arquivo. Se você quiser manter o arquivo original intacto e gravar em outro arquivo, poderá passar o novo nome de arquivo para o subcomando w rite:

ed -s in_file <<IN
78,86d
65d
51d
20,37d
w out_file
q
IN

1 A menos que você esteja disposto a calcular os novos números de linha após cada d elete, o que é bastante trivial para esse caso específico (depois de excluir as linhas 20-37, isto é, 18 linhas, a linha 45 se torna a linha 27) p>

ed -s in_file <<IN
20,37d
27d
w
q
IN

No entanto, se você tiver que excluir vários números de linhas / intervalos, trabalhar de forma inversa é óbvio.

    
por 28.01.2015 / 20:39
1

Basta lê-lo na memória, alterá-lo e depois escrevê-lo de volta. Você pode fazer algo parecido com

filename = "foo"
f = open(filename, 'r+')                                                                                                                                 
linenums = [1, 3]                                                                                                                                            
s = [y for x, y in enumerate(f) if x not in [line-1 for line in linenums]]                                                                                                                                          
f.seek(0)
f.write(''.join(s))
f.truncate(f.tell())
f.close()

Testado com um arquivo de 5 linhas. Créditos para o link , consulte a seção "Modificando um arquivo no local sem um arquivo temporário". Veja também link

Algumas notas:

  1. Primeiro, pode-se truncar o arquivo, então escreva para ele, ao invés de escrever, então truncar, como acima. No entanto, eu não sei de uma bandeira Python que permite ler e depois fazer uma gravação truncada. Mas talvez eu seja faltando alguma coisa, como o documento não é tão claro. O que traz eu para

  2. Às vezes, os documentos do Python realmente chupar. Vejo link

    Modes 'r+', 'w+' and 'a+' open the file for updating (note that 'w+' truncates the file).

    Isso significa alguma coisa para você? o que o inferno está "aberto para atualização"?

  3. Não sei se estou fazendo isso em python ao contrário de algo unixy como o editor de fluxo é melhor. isto pode ser mais portátil, mas eu não sabe como o sed portátil é. eu só escreveu assim porque eu sou mais confortável com baixo nível programação do que usando o unix clássico ferramentas, que são boas se o fizerem exatamente o que você quer, mas (eu acho) geralmente são menos flexíveis.

  4. Esta abordagem (manipulando o arquivo na memória) troca memória por disco espaço. Deve funcionar Ok em máquinas com alguns Gb de memória para arquivos para algumas centenas de Mb. Python não manusear cordas de forma muito eficiente, alternar para C / C ++, por exemplo, ligeiramente aumentar o desempenho e reduz bastante o uso de memória.

por 14.04.2011 / 12:04
0

Você pode usar o Vim no modo Ex:

ex -sc '20,37d|45d|x' file
  1. d delete

  2. x salvar e fechar

por 17.04.2016 / 04:00