Combinando os valores nos campos e atribuindo-lhes a identidade com base na correspondência

0
chr:pos1:pos2   Sun     NC      S1      S2      S3      S4      S9      S11     S14     S15     S16     S17     S18     S19     S28     S29     S30     S33     S34     S35     S36     S37     S38     S39
Aradu.A01:100145549:100145556   AG      AA      AA      AA      AA      AA      AA      AA      AA      AA      AA      AA      AA      AA      AA      AA      AA      AA      AA      AA      AA      AA
Aradu.A01:100408119:100408137   CA      TA      0       0       0       TA      TA      TA      TA      TA      TA      TA      TA      TA      TA      TA      TA      TA      TA      TA      TA      0
Aradu.A01:10102206:10102212     TG      TA      TA      TA      TA      0       TG      TA      TA      TA      TG      TG      TG      TG      TG      TA      TG      TG      TA      0       TG      TG
Aradu.A01:10112010:10112029     GA      GG      GG      GG      GG      GG      GA      GG      GG      GG      GA      0       GA      GA      GA      GG      GA      GA      GG      GA      0       GA
Aradu.A01:10112029:10112059     AC      GC      GC      GC      GC      GC      AC      GC      GC      GC      AC      0       AC      AC      AC      GC      AC      0       GC      AC      0       AC
Aradu.A01:101198026:101198058   GT      GC      GC      GC      GT      GC      0       GT      GT      GC      GT      GT      GT      0       GT      GC      GT      GC      GC      GT      0       GT
Aradu.A01:101198058:101198081   TC      CC      CC      CC      TC      CC      0       TC      TC      CC      TC      TC      TC      0       TC      CC      TC      CC      CC      TC      0       TC
Aradu.A01:101306922:101306946   AG      AA      AA      AA      AG      0       AA      AG      AG      AA      0       AG      AG      AG      AG      AA      AG      AG      AA      AG      AG      AG

No arquivo fornecido, estou tentando corresponder os valores em todos os campos colum 4 em diante com as colunas 2 e 3. Se um valor de um campo (col 4 e em diante) corresponder ao campo col 2, marque-o como S, se corresponder a col 3, marque-o como N e, se for 0, atribua -1.

A seguir, o que tentei:

NR>1  {for(i=4;i<=NF;i++)
        { if ( $i == $2 ) $i=S ;
          if ( $i == $3 ) $i=N ;
          if ( $i == 0 ) $i=-1 ;
       } ## if ;
       ## for loop is done
       print ;
       }

Isso está resultando na atribuição de todos os campos, exceto os primeiros 3 como -1.

    
por gaurav agarwal 05.05.2017 / 01:07

2 respostas

0

Isso parece fazer o truque:

NR > 1 {
  for( i=4; i<NF; i++) {
    if( $i == $2 ) {
      $i = "S"
    }
    else if( $i == $3 ) {
      $i = "N"
    }
    else if( $i == 0 ) {
      $i = -1
    }
  }
  print
}

Coloque isso em um arquivo chamado e. g. 363142.awk e execute:

$ awk -f 363142.awk /path/to/input
    
por 05.05.2017 / 01:35
0
perl -F\s+ -pale '
   $. > 1 and /(?:\S+\s+){3}/g and
   s{\G(\S+)(\s*)}
   {
      ($1 eq $F[1] ? "S" : $1 eq $F[2] ? "N" : $1 eq "0" ? -1 : $1) . $2
   }cge;
' your_genes_file

Opções

  • -F\s+ definirá o FS para um ou mais espaços em branco = > %código%
  • /\s+/ configurará um loop de leitura de arquivo implícito E a impressão é automática.
  • -p irá criar novamente cada registro baseado no delimitador de divisão de campo fornecido pela opção -a ou um espaço solitário por padrão. Os campos são armazenados no array -F .
  • @F definirá -l
  • ORS=RS=\n é o código -e a ser aplicado a cada registro.

Explicação

Ignoramos a primeira linha do processamento. A opção Perl terá o cuidado de imprimi-lo. Em seguida, estacionamos nosso marcador de mecanismo de regex no início do quarto campo, pois é onde toda a ação deve começar. Em seguida, aplicamos o comando -p nos modos s/// , global e cumulative . eval = > O marcador de regex será iniciado a partir de onde foi estacionado no último comando /c e NÃO desde o início. m//g = > pesquisaremos toda a linha para transformá-la, e /g examinará a seção /e de substituição como um código s//repl/ a ser executado e seus resultados serão estacionados na seção de substituição.

sed GNU

Isso pode ser escrito em Perl , mas o código fica no caminho da clareza e é deixado como um exercício com moderação.

sed -e '
   1b

   # fence the column 2 and go looking for col2 matching fields from col 4 onwards
   s/\S\+/\n&\n/2
   :c2
   s/\(\n\(.*\)\n\s\+\S\+\s.*\)\<\>/S/g;tc2
   s/\n//g

   # fence the column 3 and go looking for col3 matching fields from col 4 onwards
   s/\S\+/\n&\n/3
   :c3
   s/\(\n\(.*\)\n.*\)\<\>/N/g;tc3
   s/\n//

   # from col 4 onwards look for any lone 0s and change them to -1
   :zm1
   s/\(\n.*\)\<0\>/-1/;tzm1
   s/\n//

' gene_file.dat

Perl

Aqui, removemos qualquer espaço em branco principal que interfira na indexação do array @F e, em seguida, o restabeleça no momento da impressão dos dados. Para o POSIX sed nós alimentamos os elementos 6 em diante (4 + 2 para espaços em branco) e apenas verificamos se eles são iguais às colunas 2nd / 3rd ou 0.

perl -F'(\s+)' -lane '
   print,next if $. == 1;
   my $dummy = splice @F, 0, 2 if /^\h/;
   print $dummy, @F[0..5], map {
      s/^\Q$F[2]\E$/S/ or s/^\Q$F[4]\E$/N/ or s/^0$/-1/; $_
   } @F[6 .. $#F];
' gene_file.dat
    
por 05.05.2017 / 07:06