extrai linha do arquivo

0

um arquivo que eu preciso para extrair informações de aparências como

2       41620   .       T       G       100     PASS    AC=3;AF=0.000599042;AN=5008;NS=2504;DP=18872;EAS_AF=0;AMR_AF=0;AFR_AF=0;EUR_AF=0;SAS_AF=0.0031;AA=.|||;CSQ=G|ENSG00000184731|ENST00000327669|Transcript|missense_variant|954|954|318|K/N|aaA/aaC|||-1|tolerated(0.47)|benign(0)||||;GENCODE=ENST00000327669

a saída que eu preciso seria

2   41620   CSQ=G    missense_variant

os campos principais são sempre divididos por ||| mas não que o 2 41620 seja do primeiro campo e o CSQ = G e a variante missense seja do seguinte. Não precisa ser missense_variant nem algo ao longo das linhas, mas é sempre o primeiro e quarto campo após o primeiro |||.

Como alcançar em perl, awk, sed ou assim?

    
por user3069326 17.02.2016 / 06:46

1 resposta

-1

Como você mencionou que os dados estão sempre nas mesmas colunas, o AWK é apropriado para essa tarefa. No entanto pequena coisa é que você tem dados que é até certo ponto tem espaço como separador, mas depois muda para usando barra vertical como separador. Assim, precisamos de um pouco mais de hackers AWK complexos.

awk '{gsub(/[;]/," ");printf "%s %s ",$1,$2; for(i=1;i<=NF;i++){ if($i~/\|\|\|/) {gsub(/\|/," ");printf "%s %s",$(i+1),$(i+5);break} } printf "\n"; }' testData.txt

Para colocar o código acima em forma de script,

#!/usr/bin/awk -f 

{ 
  gsub(/[;]/," ");
  printf "%s %s ",$1,$2; 
  for(i=1;i<=NF;i++){ 
     if($i~/\|\|\|/) {
        gsub(/\|/," ");
        printf "%s %s",$(i+1),$(i+5);
        break
     } 
   } 
   printf "\n";
}

Coloque isso em um arquivo, chame-o de myScript.awk ou qualquer coisa, adicione permissões exec com chmod +x myScript.awk e forneça o arquivo de entrada como argumento

Execução da amostra:

$ chmod +x dataExtract.awk
$ ./dataExtract.awk testData.txt                               
2 41620CSQ=G missense_variant

Nota: na pergunta que você disse, missense_variant é o quarto campo, mas na verdade é o quinto campo no exemplo que você postou. Eu ajustei de acordo

Edite conforme solicitado nos comentários:

#!/usr/bin/awk -f 

{ 
  gsub(/[;]/," ");
  printf "%s\t%s\t",$1,$2; 
  for(i=1;i<=NF;i++){ 
     if($i~/\|\|\|/) {
        gsub(/\|/," ");
        printf "%s\n" $(i+5);
        break
     } 
   } 
}
    
por Sergiy Kolodyazhnyy 17.02.2016 / 08:51