Como percorrer um arquivo e transformar cada linha em uma nova expressão regular em uma instrução awk?

0

FileA.txt:

ATGCATGC 
GGGGGGTT
TTTTT
AAAA

FileB.txt:

asdfasdf
blah2
ATGCATGC
blah3
blah4 
delte-me-too
GGGGGGTT
blah5
blah5
....

Eu quero comparar cada linha do FileA.txt e verificar se está no FileB.txt. Se estiver no arquivo B, desejo excluir o seguinte:

  1. Linha correspondente

  2. Uma linha acima

  3. Duas linhas abaixo

e saída em um novo arquivo.

NOTA: Haverá 500.000 linhas no FileA. Eu gostaria de fazer isso de uma forma que não codifique os padrões.

Atualmente, tenho algo para excluir as linhas, mas estou ficando desarmado com o loop através do FileA para criar um novo padrão para essa expressão awk:

awk '/$VARIABLE_REGEX/{for(x=NR-2;x<=NR+2;x++)d[x];} {a[NR]=$0}
END{for(i=1;i<=NR;i++)
    if(!(i in d))
        print a[i]}' FileB.txt
    
por Anonymous 06.02.2016 / 06:16

3 respostas

0

Nota: nenhuma verificação de erros. Além disso, a suposição é que a entrada no segundo arquivo segue exatamente o padrão mencionado.

awk 'NR== FNR {a[$0] = $0 ; next } {if (!($0 in a)) {b[count++] = $0; } else {count--; if (count > 0) delete b[count];getline;getline; }} END {for (i=0; i<count; i++) print b[i] }' 1 2

entradas estão em 1 e 2

1

ATGCATGC
GGGGGGTT
TTTTT
AAAA

2

asdfasdf
blah2
ATGCATGC
blah3
blah4 
delte-me-too
GGGGGGTT
blah5
blah5
foo
foo-delete
AAAA
bar-delete
bar-delete
bar-ok

Saída

asdfasdf
foo
bar-ok
    
por 06.02.2016 / 08:08
0

O código seguinte não é o ideal (porque tem que ler FileB.txt duas vezes) mas espero que seja mais rápido que o awk

comm --nocheck-order -23 FileB.txt <(grep -B1 -A2 -Ff FileA.txt FileB.txt)

Com o novo comando GNU sed e você pode tentar (para economizar memória) sed + grep :

sed 'N;h;s/.*\n//;s/.*/grep -xF "&" FileA.txt/e;/./{N;N;d};x;P;D' FileB.txt
    
por 06.02.2016 / 11:46
0

Isso funciona com sua amostra

awk '
    NR==FNR {patt[$0]; next} 
    $0 in patt {getline; getline; getline; prev=$0; next} 
    {print prev; prev=$0} 
    END {print prev}
' fileA.txt fileB.txt 

Você precisa manter todo o arquivo na memória, mas só precisa se lembrar de uma linha de cada vez do arquivo B

    
por 06.02.2016 / 14:22