A opção grep -F
pesquisa literal strings em qualquer lugar na linha atual. Por definição, literal significa que você não pode usar expressões regulares para restringir sua busca para estar dentro do campo 3 (delimitado por TAB) .
Você pode, no entanto, usar o grep -f
para ler a entrada do padrão arquivo1 - mas é necessário modificá-lo em uma lista de expressões regulares. Aqui está uma maneira de usar o bash process substitution e sed para gerar uma lista de expressões regulares padrão que grep -f
pode manipular.
Usando o grep com Expressões regulares básicas :
grep -f <(sed 's/.*/^\([^\t]\+\t\)\{2\}\([^\t]\+,\)*&[,\t]/' file1) file2
Para o regex básico do grep, file1
é dinamicamente convertido para:
^\([^ ]\+ \)\{2\}\([^ ]\+,\)*Locus_1[, ]
^\([^ ]\+ \)\{2\}\([^ ]\+,\)*Locus_2[, ]
^\([^ ]\+ \)\{2\}\([^ ]\+,\)*Locus_3[, ]
OR : Usar grep -E
com Expressões regulares estendidas simplifica visualmente o código, evitando a necessidade da maioria das contrabarras em grep
e sed
grep -Ef <(sed 's/.*/^([^\t]+\t){2}([^\t]+,)*&[,\t]/' file1) file2
Para o regex estendido do grep, file1
é dinamicamente convertido para:
^([^ ]+ ){2}([^ ]+,)*Locus_1[, ]
^([^ ]+ ){2}([^ ]+,)*Locus_2[, ]
^([^ ]+ ){2}([^ ]+,)*Locus_3[, ]
A saída (em ambos os casos) :
3 3 Locus_1 Locus_40 etc_849
3 2 Locus_2 Locus_94 *
2 3 Locus_3,Locus_4 Locus_50 *
Tenha em atenção que -f
e -F
podem abrandar drasticamente as coisas enquanto file1
é grande