Lê / manipula dados da coluna para enésima recorrência

0

Eu tenho uma matriz onde eu tenho conta para genes em diferentes amostras

Col1: GeneName
Col2: Length
Col3;Col4;Col5; Counts for genes in sampleA/sampleB/sampleC
Col6;Col7;Col8; Total counts in sampleA/sampleB/sampleC

Esta é uma matriz de exemplo.

A1BG    1758    53  4373    207 46005749    43849471    31554941 
A1BG-AS1    2126    5   88  12  46005749    43849471    31554941
A1CF    9695    8882    3522    437 46005749    43849471    31554941 
A2M 5399    15963   12325   7227    46005749    43849471    31554941 
A2M-AS1 6660    50  33  36  46005749    43849471    31554941 

Eu quero dividir counts_sampleA / (total_counts_sampleA * Length) e assim por diante para outras amostras

cat inFile | awk 'BEGIN {OFS="\ t"} {imprimir 1, 2, 3/6, 4/7, 5/8)

Este é o resultado esperado

A1BG    1758    6.55307e-10 5.67278e-08 3.73151e-09  
A1BG-AS1    2126    5.11204e-11 9.43963e-10 1.78875e-10   
A1CF    9695    1.99136e-08 8.28471e-09 1.42845e-09   
A2M 5399    6.42672e-08 5.20606e-08 4.24207e-08   
A2M-AS1 6660    1.63186e-10 1.12999e-10 1.71301e-10  

Funciona bem, mas não é bom quando a matriz é grande. Como eu escreveria se houvesse 100 amostras, onde column3-colum102 teria geneCountinEachSample e Coulmn103-column202 teria totalCountinEachSample.

Eu quero usá-lo com um loop for, então, quando há mais amostras, ele funciona com um número arbitrário de colunas?

cat inFile | awk 'BEGIN {OFS="\t"} { row=NF; samples=3; size=$samples+2; for ( i=3; i<=$size; i++); END print $i/$[$i+$samples] }'

Qualquer sugestão sobre como fazer isso funcionar. Obrigado!

    
por CN_229133 28.04.2017 / 23:51

2 respostas

0
perl -F'\s+' -lane '$,="\t"; # OFS made a TAB
   my($gN, $gL) = splice @F, 0, 2; # store gene name & length
   print $gN, $gL, map { sprintf "%.5e", $F[$_] / ( $F[$_+@F/2] * $gL ) } 0 .. @F/2-1;
' gene_samples.file
  • FS está definido para um ou mais espaços em branco.
  • ORS = RS = \n
  • @F contém campos para um determinado registro.
  • splice divide dois elementos a partir do deslocamento 0 e reduz também o tamanho da matriz.
  • Da especificação OP, do que resta em @F, há elementos numerados pares. A primeira metade é counts_for_each_sample & a segunda metade é total_count_for_each_sample.

Resultados

A1BG      1758  6.55307e-10  5.67278e-08  3.73151e-09
A1BG-AS1  2126  5.11204e-11  9.43963e-10  1.78875e-10
A1CF      9695  1.99136e-08  8.28471e-09  1.42845e-09
A2M       5399  6.42672e-08  5.20606e-08  4.24207e-08
A2M-AS1   6660  1.63186e-10  1.12999e-10  1.71301e-10
    
por 03.05.2017 / 13:00
2

Bem, você quase conseguiu a resposta:

awk '
     {cols=((NF/2) + 1)
      for (i=1; i <= cols; i++) {
          if (i >= 3) {
              count_index= i + cols - 2
              printf("%s\t", 1.0 * $i / ($count_index * $2))
          } else {
              printf("%s\t", $i) 
          }
      }
      printf("\n")
     }' inFile

Note que usar cat file | awk ... é suboptimal, o awk trata os arquivos como argumentos diretamente; Mesmo assim, fazer awk ... < infile seria melhor que uso inútil de gato .

    
por 02.05.2017 / 17:36