Looping através de csv, removendo padrões

1

Tenho uma pergunta semelhante à minha pergunta anterior , mas um pouco diferente

diga que você tem 10 colunas em cada linha e 100000 linhas, quero verificar se cada linha segue os seguintes padrões:

Se uma linha se parece com isso, eu quero removê-lo

 lambda a, b, c, d: a==a and a+1==b and b+1==c and c+1==d and d+1==e

Enquanto esta solução funciona muito bem, todas as soluções funcionaram, todas seguiram a mesma lógica. O problema é que, digamos, eu tenho 10 linhas, essa solução remove linhas que têm 5 números consecutivos começando de a para e,

Se a sequência começar de b para f, ela permanecerá

Eu quero uma solução que seja controlada por um loop, então não terei que continuar adicionando e removendo variáveis

Quero remover todas as sequências acima de 3, na linha

Quero dizer que, se houver 3 números consecutivos na linha, a==a and a+1==b and b+1==c os deixará, se houver mais de 3 números consecutivos a==a and a+1==b and b+1==c and c+1==d and so on , remova-os, onde quer que ocorram.

Quero dizer que pode ser

a==a and a+1==b and b+1==c and c+1==d

a==a and a+1==a and b+1==c and c+1==d and d+1==e and e+1==f

and so on

Então eu prefiro fazer isso em um loop ou solução similar, então eu não tenho que escrever todas as possibilidades

Como da última vez, eu prefiro awk ou perl para fins de aprendizado, um amigo me disse que haskell pode fazer isso facilmente, mas eu não encontrei a solução no haskell, se isso é verdade, então estou curioso para saber sabe como.

Por favor note que eu não me importo com soluções recursivas. Vou editar minha pergunta para dar exemplo de entrada e saída em poucas horas, quando eu voltar para casa

EDITAR

exemplo de entrada

1,2,3,4,5,6,7,8,9
1,5,8,11,14,16,17,18,19
1,2,3,5,7,9,15,29,34
11,22,25,30,40,55,80,83,90

saída esperada

1,2,3,5,7,9,15,29,34
11,22,25,30,40,55,80,83,90

Razão: a terceira linha, contém apenas 3 números consecutivos, quarta linha, não contém números consecutivos. as duas primeiras linhas devem ser removidas.

    
por Lynob 01.10.2014 / 14:48

2 respostas

3

testado:

awk -F, '{
    for (i=1; i<=NF-3; i++) 
        if ($i+1==$(i+1) && $i+2==$(i+2) && $i+3==$(i+3))
            next
    print
}' file
    
por glenn jackman 01.10.2014 / 15:57
1

Perl: (reeditado, depois que os exemplos foram adicionados à pergunta)

da linha de comando:

perl -F, -ane'my($a,$b)=$F[0];$b=$b>($l=$a++==$_?$l+1:0)?$b:$l for@F;print if $b>5' \
file.txt

se você quiser alterar o arquivo, use o sinalizador -i para a versão da linha de comando ou use o operador de redirecionamento do seu shell ( > , não o use-o no mesmo arquivo, porque ele será truncado antes é lido!).

    
por Patrick J. S. 01.10.2014 / 17:35