Expertos: Quero extrair campos com base em uma string (parcial e exata). Em algumas linhas esses campos são movidos uma ou duas colunas , então não consigo especificar a coluna (que é a extensão do meu conhecimento). Eu também preciso extrair o 1º, 2º, 4º e 5º campos, mas eles não variam de linha para linha, então eu posso fazer isso sozinho.
Especificamente, quero extrair o campo com a string parcial " DP4= " e o campo com uma string correspondente como " MODERATE " mais o campo à esquerda e à direita :
entrada:
NW_006532014.1 603822 . T C 222.0 . DP=103 ADF=30,22 ADR=13,16 AD=43,38 VDB=0.0570121 SGB=-0.693143 RPB=0.810487 MQB=0.570226 MQSB=0.033126 BQB=0.964281 MQ0F=0 ICB=1 HOB=0.5 AC=1 AN=2 DP4=30,13,22,16 MQ=35 ANN=C missense_variant MODERATE ABCB6 ABCB6 transcript XM_007419806.2
NW_006532015.1 1015800 . AAA AAACAA 228.0 . INDEL IDV=106 IMF=0.905983 DP=117 ADF=6,50 ADR=19,42 AD=25,92 VDB=0.22041 SGB=-0.693147 MQSB=0.182586 MQ0F=0 AC=2 AN=2 DP4=6,19,50,42 MQ=36 ANN=AAACAA disruptive_inframe_insertion MODERATE CEP131 CEP131 transcriptXM_025166060.1 protein_coding 11/27
NW_006532017.1 910856 . C G 78.0 . DP=118 ADF=50,14 ADR=25,2 AD=75,16 VDB=0.954018 SGB=-0.689466 RPB=0.939107 MQB=0.0031569 MQSB=0.280595 BQB=0.0859367 MQ0F=0 ICB=1 HOB=0.5 AC=1 AN=2 DP4=50,25,14,2 MQ=44 ANN=G missense_variant MODERATE HPS1 HPS1 transcript XM_025169525.1
NW_006532033.1 475415 . T C 222.0 . DP=123 ADF=18,36 ADR=18,15 AD=36,51 VDB=0.984451 SGB=-0.693147 RPB=0.428811 MQB=1.68713e-05 MQSB=0.565818 BQB=0.837943 MQ0F=0 ICB=1 HOB=0.5 AC=1 AN=2 DP4=18,18,36,15 MQ=41 ANN=C missense_variant MODERATE PTCH2 PTCH2 transcript XM_025164053.1
NW_006532040.1 586236 . G C 29.9689 . DP=106 ADF=40,9 ADR=25,1 AD=65,10 VDB=0.731987 SGB=-0.670168 RPB=0.945403 MQB=0.00509228 MQSB=0.210814 BQB=0.365756 MQ0F=0 ICB=1 HOB=0.5 AC=1 AN=2 DP4=40,25,9,1 MQ=46 ANN=C missense_variant MODERATE OMG OMG transcript XM_007420376.3
NW_006532040.1 674528 . T C 221.0 . DP=128 ADF=39,15 ADR=19,9 AD=58,24 VDB=0.253732 SGB=-0.692831 RPB=0.952839 MQB=1.09944e-10 MQSB=0.755937 BQB=0.749586 MQ0F=0 ICB=1 HOB=0.5 AC=1 AN=2 DP4=39,19,15,9 MQ=48 ANN=C missense_variant MODERATE NF1 NF1 transcript XM_007420379.3
saída desejada (tab-delim):
DP4=30,13,22,16 missense_variant MODERATE ABCB6
DP4=6,19,50,42 disruptive_inframe_insertion MODERATE CEP131
DP4=50,25,14,2 missense_variant MODERATE HPS1
DP4=18,18,36,15 missense_variant MODERATE PTCH2
DP4=40,25,9,1 missense_variant MODERATE OMG
DP4=39,19,15,9 missense_variant MODERATE NF1
Obrigado!
Usando GNU awk para o 3º argumento para
match()
,\<
limite de palavra e\s/\S
abreviação:usamos a função split() para dividir a linha de processamento atual a cada vez em um array temporário chamado tmp no FS padrão (espaços em branco, ou seja, em Tabs/Spaces); a
nrf
é apenas uma variável temporária que usei e que contém o número de campos que a função split() dividiu.então usamos um for-look nesses campos e verificamos se o campo atual
tmp[i]
que é lido atende às condições que você espera, se fosse nós, imprimindo senão, estamos verificando a próxima condição, se isso foi visto, imprima um campo anterior para eletmp[i-1]
em seguida, o próprio campo atual, emtmp[i]
seguida, o próximo campo à direitatmp[i+1]
, caso contrário, imprimimos uma string vazia""
.variáveis temporárias
s1
es2
são usadas para controlar o delimitador de campos entre a primeira e a segunda ação de condições de impressão, portanto, se uma foi encontrada antes, os próximos campos devem imprimir OFS antes com antecedência.