Tenho um arquivo grande com o seguinte formato tab
-separado:
#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT recombination
chr1 586001 >63041388>63041391 G A 60 . AC=80;AF=0.3125;AN=256;AT=>63041388>63041390>63041391,>63041388>63041389>63041391;NS=3;LV=0 GT 1|2|3|
Agora, a última coluna, a décima, aparece como muitos números divididos por uma barra vertical |
; no entanto, o que desejo alcançar é o seguinte:
#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT recombination
chr1 586001 >63041388>63041391 G A 60 . AC=80;AF=0.3125;AN=256;AT=>63041388>63041390>63041391,>63041388>63041389>63041391;NS=3;LV=0 GT 1|1 2|2 3|3
Consegui separar as colunas tab
substituindo o |
símbolo, o que me deixa com a forma de duplicá-las e adicionar novamente os |
números entre elas. Tentei algumas vezes com for
loops, mas o melhor que consegui fazer foi imprimir apenas duas colunas como tal:
1 1
2 2
3 3
...
caso contrário, printf
obtenho uma saída de uma linha, mas não consigo manter o contador com o mesmo valor da coluna inicial... Qualquer ajuda é muito apreciada, obrigado antecipadamente!
Isto deve resolver:
Explicação
awk -F '\t' -v OFS='\t'
: defina os separadores de campo de entrada (-F '\t'
) e saída (-v OFS='\t'
) como uma tabulação./^[^#]/{ ... }
: em linhas que não começam com#
, ou seja, linhas que não são de cabeçalho.gsub("\\|","\t",$10);
: substitua tudo|
no 10º campo por tabulações.gsub("[0-9]+","&|&\t",$10)
: agora substitua todos os conjuntos de dígitos por eles mesmos, a|
e depois eles mesmos novamente e uma tabulação./^[^#]/{ ... }1'
: a ação padrãoawk
quando algo é avaliado como verdadeiro é imprimir o registro atual (linha), então este1
, que sempre é avaliado como verdadeiro (diferente de 0) e está fora do/^[^#]/{}
condicional, imprimirá todas as linhas.É assim que aparece nos seus dados (mostrando apenas os primeiros campos para maior clareza):
Observe que este não é um VCF válido e você também precisará ter um nome de amostra no
#CHROM
cabeçalho para cada genótipo listado para que as ferramentas projetadas para consumir VCFs possam lidar com ele corretamente.Usando
awk
:-F
e o separador de campoOFS
O
de saída são definidos como ab.F
S
\t
$10
devesplit
sera
disposto por p|
pe como sep.$10
é definido como uma string vazia""
.$10
é recriado usandofor
loop.1
é true sempre que imprime o registro atual. Na verdade, qualquer coisa é verdade, exceto string vazia ou zero.Se você não se importar com um extra
tab
no final do registro, o comando pode ser encurtado para$10 = $10 a[i]"|"a[i] OFS
.