Como excluo uma linha aleatória em um arquivo de texto de um determinado intervalo?

4

Eu tenho um arquivo de texto e quero excluir linhas aleatórias de um intervalo. Aqui está um exemplo:

Line 1: abcd
Line 2: efgh
Line 3: ijkl
Line 4: mnop
Line 5: qrst
Line 6: uvwxyz

Fora desses seis, eu quero excluir aleatoriamente, digamos, 3.

Como fazer isso? Seria ótimo se houvesse uma solução no vim, portanto, é possível aplicá-la em diferentes faixas.

    
por deshmukh 13.07.2012 / 07:16

4 respostas

6

Aqui está uma solução usando sed :

sed -i $((start + RANDOM % range))d filename.txt

onde:

  • start é o número da linha inicial do seu intervalo
  • intervalo (ou end-start é o número de linhas a serem incluídas de start )
  • sed -i -Nd diz a sed para deletar a linha N no arquivo de entrada
  • RANDOM é o gerador de números aleatórios do bash; uma variável de shell especial que contém um inteiro aleatório entre 0 e 32767 quando você o usa.

Assim, por exemplo, para excluir uma linha aleatória entre as linhas 90 e 120 no arquivo test.txt , você usaria:

sed -i $((90 + RANDOM % 30))d test.txt
    
por ish 13.07.2012 / 07:38
1

Para excluir várias linhas aleatórias de um intervalo específico no arquivo de texto, eis o que fiz:

  • Abra o arquivo no vim
  • Vá para o topo do intervalo de onde você deseja remover várias linhas aleatórias. O intervalo deve ter uma linha vazia na parte inferior
  • Digite o seguinte comando:

    .,/^\s*$/-1 !sed -e $((9 * $RANDOM / 32267))d
    

- A partir daqui

, / ^ \ s * $ / - 1 - Até a última linha não em branco

! sed -e $ ((9 * $ RANDOM / 32267)) d - o comando sed para excluir uma linha aleatória

Isso excluirá uma linha aleatoriamente.

Agora, se você quiser excluir mais 5 linhas aleatórias, basta fazer 5 @: e vim faz o resto.

Isso pode ser melhorado ainda mais se eu puder substituir esse 9 (número de linhas do qual deletar) com alguma expressão que será universal

    
por deshmukh 14.07.2012 / 06:41
0

Use o seguinte comando

:nd

onde n é o número da linha.

    
por James 13.07.2012 / 07:24
0

Também é possível com python :

bash-4.3$ python -c 'import sys,random;lines=sys.stdin.readlines();lines.pop(random.randint(0,len(lines)-1));print "".join(lines)' < input.txt
Line 1: abcd
Line 2: efgh
Line 3: ijkl
Line 5: qrst
Line 6: uvwxyz

O processo aqui é simples, nós redirecionamos o arquivo de entrada para stdin do python e lemos todas as linhas em uma lista. Em seguida, selecionamos o índice de linhas aleatórias via função random.randint() dentro do intervalo de todos os índices na lista, do índice 0 ao último índice (é o que o len(lines)-1 faz). Esse índice é removido da lista por meio de lines.pop() e, em seguida, imprimimos o texto reagrupado. Muito simples

    
por Sergiy Kolodyazhnyy 30.12.2016 / 04:56