Sério, essa expressão regular é ridícula.
Em vez disso, escreva as strings, uma por linha, em um arquivo de texto simples e use
grep -v -w -F -f patternfile inputfile >outputfile
Isso só exibirá linhas de inputfile
que não contenham as strings listadas em patternfile
. O -F
flag fará com que grep
trate as strings como strings e não como expressões regulares (isso provavelmente fará com que use menos memória também). O -w
sinalizador garante que você corresponderá palavras inteiras e não substrings de palavras (ou seja, NA21130
corresponderá apenas a NA21130
e não GNA21130
ou NA211301
).
Se você quiser procurar especificamente a string na coluna 5:
awk 'NR == FNR { pattern[$0] = 1; next } !pattern[$5]' patternfile inputfile >outputfile
Isso primeiro lerá as strings de patternfile
em uma matriz, indexada pelas strings. Em seguida, ele lerá inputfile
e testará se o valor na coluna 5 é um índice na matriz. Se não for, a linha é passada.
Observe também que em um sistema POSIX, o comprimento combinado máximo permitido de uma linha de comando e o ambiente atual (todas as variáveis de ambiente e seus valores) têm garantia de pelo menos 4 KB. Na maioria dos sistemas é mais ou muito mais do que isso, mas você deve estar preparado para receber a mensagem de erro Argument list too long
ao tentar executar comandos como a linha de comando de 16 KB na pergunta.