grep comando dando erro

5

Estou usando o grep para filtrar o conteúdo de alguns padrões (genes no meu caso). Para mais informações, aqui está o link anterior.

Encontre o padrão de um arquivo listado em outro

Meu código (deve funcionar), mas não é.

 grep -f file1 file2

Aqui está meu subconjunto de genes (file1):

C1QTNF3
C5orf22
C5orf28
C5orf34
C5orf38
C5orf42
C5orf49
C5orf51
C5orf64
C6
C7
C9
CAPSL
CARD6
CARTPT
CCDC125
CCDC152
CCL28
CCNB1
CCNO
CCT5
CD180
CDC20B
CDH10
CDH12
CDH18
CDH6
CDH9
CDK7
CENPH
CENPK
CKMT2
CLPTM1L
CMBL
CMYA5
COL4A3BP
CR749689
CRHBP
CRSP8P
CT49
CTNND2
CWC27
DAB2
DAP
DDX4
DEPDC1B
DHFR
DHX29
DIMT1
DMGDH

E abaixo está o meu arquivo de texto (arquivo2) que está sendo combinado, mesmo que não haja nenhum gene UNC79 no arquivo 1 como visto em SNPEFF_GENE_NAME = UNC79 mostre estar presente no arquivo2.

  AC=3;AF=0.016;AN=186;BaseQRankSum=0.075;DB;DP=292;Dels=0.00;FS=4.271;HaplotypeScore=0.0891;InbreedingCoeff=0.0225;MLEAC=2;MLEAF=0.011;MQ=59.18;MQ0=1;MQRankSum=0.969;QD=13.42;ReadPosRankSum=-0.373;SNPEFF_EFFECT=INTRON;SNPEFF_EXON_ID=23;SNPEFF_FUNCTIONAL_CLASS=NONE;SNPEFF_GENE_BIOTYPE=protein_coding;SNPEFF_GENE_NAME=UNC79;SNPEFF_IMPACT=MODIFIER;SNPEFF_TRANSCRIPT_ID=ENST00000256339;VQSLOD=9.31;culprit=DP

Portanto, a saída do grep é todo o blob de texto do arquivo2.

Abaixo está a linha completa do arquivo, que dá problema. A segunda coluna é o nome do gene. Eu não tenho esse gene no meu arquivo1. E então eu não quero a saída dessa linha em particular. Eu tenho 1000 dessas linhas de genes diferentes, que precisam ser filtrados apenas para os genes que estão no arquivo1.

    intronic    UNC79   14  94062922    94062922    A   G   het 80.54   3   14  94062922    rs183710732 A   G   80.54   PASS    AC=3;AF=0.016;AN=186;BaseQRankSum=0.075;DB;DP=292;Dels=0.00;FS=4.271;HaplotypeScore=0.0891;InbreedingCoeff=0.0225;MLEAC=2;MLEAF=0.011;MQ=59.18;MQ0=1;MQRankSum=0.969;QD=13.42;ReadPosRankSum=-0.373;SNPEFF_EFFECT=INTRON;SNPEFF_EXON_ID=23;SNPEFF_FUNCTIONAL_CLASS=NONE;SNPEFF_GENE_BIOTYPE=protein_coding;SNPEFF_GENE_NAME=UNC79;SNPEFF_IMPACT=MODIFIER;SNPEFF_TRANSCRIPT_ID=ENST00000256339;VQSLOD=9.31;culprit=DP    GT:AD:DP:GQ:PL  0/1:1,2:3:33:39,0,33
    
por Ron 19.02.2014 / 23:39

3 respostas

6

Como os nomes dos seus genes estão sempre na segunda coluna do arquivo, você pode usar awk para isso:

awk '
    {   ## while reading the first file, save name in the array a
        if(NR==FNR){a[$1]++;} 

        ## If this is the 2nd file
        else{
            ## print if the value of the second column is defined in the array 
            if($2 in a){print}
        }
    }' file1 file2

O mesmo, condensado:

awk '{if(NR==FNR){a[$1]++;}else{if($2 in a){print}}}' file1 file2 

mais condensado:

awk '(NR==FNR){a[$1]++}($2 in a){print}' file1 file2 

e verdadeiramente minimalista (em resposta a @Awk):

awk 'NR==FNR{a[$1]}$2 in a' file1 file2 
    
por 20.02.2014 / 17:13
7

Seu file2 inclui uma substring que grep está correspondendo a uma das linhas de file1 .

Exemplo

Vocêpodevernacapturadetelaacima,otextoédestacadoemvermelhoporgrep.Aliás,vocêpodequererusarorecursodedestaquedecorestambém:

$grep--color=auto-ffile1file2

Maseuquerocombinarapenaspalavrasinteiras??

Sevocêquiserquegrepretornecorrespondênciasquesejam"palavras inteiras", inclua a opção -w . Isso só retornará correspondências são correspondências de palavras inteiras usando as "palavras" de file1 .

Aqui eu criei outro arquivo ( file1a ) que inclui o gene UNC79 .

$ grep C7 file1 file1a
file1:C7
file1a:C7
file1a:UNC79

Aqui, quando executo o comando grep -wf ... com os dois arquivos de índice ( file1 e file1a ), você pode ver que não recebemos correspondência para file1 e uma correspondência com file1a .

trecho da página man grep

   -w, --word-regexp
          Select only those lines containing matches that form whole words.
          The test is that the matching substring must  either  be  at  the
          beginning  of  the  line,  or  preceded by a non-word constituent
          character.  Similarly, it must be either at the end of the line or
          followed by a non-word constituent character.  Word-constituent
          characters are letters, digits, and the underscore.

Esse truque funciona na situação do @Ron porque seus nomes de genes são limitados por caracteres não-palavra ( = ) e são terminados com ( ; ). Caso contrário, esse truque provavelmente não funcionaria.

    
por 20.02.2014 / 00:01
1

@ terdon Você pode tornar mais simples

awk 'NR==FNR{a[$1];next}($2 in a)' fil1 file2

- editar ---

@terdon

+1 se sempre está na segunda coluna, então tudo bem, mas o problema é depois de armazenar o índice na matriz que é a[$1] ao ler o arquivo1, ele simplesmente verifica $2 in a do arquivo1, isso apenas mata algum tempo também, aqui exemplo de obter resultado inesperado sem next , por favor, não se preocupe aqui eu não estou dizendo a sua resposta está errada, eu estou apenas tentando mostrar que ele simplesmente lê arquivo mesmo depois de seu trabalho já que está armazenando o índice na matriz% código%.

$ cat f1
1 0
2 0
3 0
4 1
1 2
2 3
3 4

$ cat f2
NOTHING

# Bad result without next, still awk is reading f1, this kills time right ?
$ awk 'NR==FNR{a[$1]}$2 in a' f1 f2
4 1
1 2
2 3
3 4


# It gives nothing but it's right 
$ awk 'NR==FNR{a[$1];next}$2 in a' f1 f2
    
por 20.02.2014 / 18:06

Tags