• Publicidad

Edición en columna de tabla

Perl aplicado a la bioinformática

Edición en columna de tabla

Notapor Richard10 » 2016-09-06 13:12 @592

Hola chicos:

Espero alguien me pudiera ayudar para editar la información de una tabla mediante línea de comandos ya que soy nuevo en esto.

La tabla que tengo presenta la siguiente información en el .txt adjunto.
En la columna de logFC se expresa el nombre del gen pero es demasiado largo y quisiera solo trabajar con el GeneID.

Por ejemplo, de

Dbxref=GeneID:105370384;Name=LOC105370384
Dbxref=GeneID:128869,HGNC:HGNC:15791,HPRD:12250,MIM:608528;Name=PIGU

quisiera mantener en esa columna solo 105370384 y 128869
manteniendo los valores e información del resto de columnas de mi tabla.

Archivo de ejemplo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
  1. logFC   logCPM  PValue  FDR     IND.10.N.3_GCF  NOTRAT.1_GCF    IND.10.N.3_GCF  NOTRAT.1_GCF    DE      Regulation             
  2. Dbxref=GeneID:105370384;Name=LOC105370384       953     516     0.885105148     437     0.904246783     437.0008964     953     516     44.79746355     31.18396657     90.42
  3. "Dbxref=GeneID:128869,HGNC:HGNC:15791,HPRD:12250,MIM:608528;Name=PIGU"  940     506     0.893523372     434     0.904221549     434.0009198     940     506     44.18637538     30.57962613     90.42
  4. "Dbxref=GeneID:55501,HGNC:HGNC:17423,HPRD:13056,MIM:610129;Name=CHST12" 416     212     0.972519264     204     0.904208933     204.0023181     416     212     19.55482144     12.81201727     90.42
  5. "Dbxref=GeneID:116285,HGNC:HGNC:18049,MIM:614357;Name=ACSM1"    851     455     0.903292587     396     0.904196316     396.0010302     851     455     40.00277175     27.4974899      90.42
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
Richard10
Perlero nuevo
Perlero nuevo
 
Mensajes: 8
Registrado: 2013-04-03 17:35 @774

Publicidad

Re: Edición en columna de tabla

Notapor explorer » 2016-09-06 17:04 @753

Es una tarea sencilla, pero hay que tener en cuenta el caso de que el primer campo vaya entrecomillado.

Se supone que lo que queremos hacer es quitar 'Dbxref=GeneID:' del primer campo de la línea, de todas las líneas.

Se puede hacer desde la misma línea de comandos. Por ejemplo:

Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. perl -p -e 's/^("?)Dbxref=GeneID:/$1/' example.txt > salida.txt
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

Explicación:
  • la opción '-p' nos permite abrir el archivo 'example.txt' y hacer un bucle por todas las líneas
  • por cada una de ellas, ejecutaremos el trozo de código indicado por la opción '-e'
  • además, la opción '-p' imprime el resultado de la transformación, al final del programa
  • Como la salida está redirigida, el shell lleva el resultado a 'salida.txt'
  • el programa consiste en una sustitución, en caso de que encontremos el patrón
  • el patrón dice: al comienzo ('^') puede haber ('?') un carácter de comilla doble ('"'). En ese caso, lo capturamos ('()')
  • y eso va seguido del texto 'Dbxref=GeneID:'
  • si el patrón coincide, lo sustituimos por lo capturado antes ('$1') (un carácter de comilla doble, o nada)
El resultado es:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
  1. logFC   logCPM  PValue  FDR     IND.10.N.3_GCF  NOTRAT.1_GCF    IND.10.N.3_GCF  NOTRAT.1_GCF    DE      Regulation             
  2. 105370384;Name=LOC105370384     953     516     0.885105148     437     0.904246783     437.0008964     953     516     44.79746355     31.18396657     90.42
  3. "128869,HGNC:HGNC:15791,HPRD:12250,MIM:608528;Name=PIGU"        940     506     0.893523372     434     0.904221549     434.0009198     940     506     44.18637538     30.57962613     90.42
  4. "55501,HGNC:HGNC:17423,HPRD:13056,MIM:610129;Name=CHST12"       416     212     0.972519264     204     0.904208933     204.0023181     416     212     19.55482144     12.81201727     90.42
  5. "116285,HGNC:HGNC:18049,MIM:614357;Name=ACSM1"  851     455     0.903292587     396     0.904196316     396.0010302     851     455     40.00277175     27.4974899      90.42
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Edición en columna de tabla

Notapor Richard10 » 2016-09-08 12:05 @545

Hola, muchas gracias.

Pero si ahora solo quisiera quedarme con los datos posteriores a Name=, es decir, de una línea

Dbxref=GeneID:128869,HGNC:HGNC:15791,HPRD:12250,MIM:608528;Name=PIGU

mantener únicamente PIGU en esa columna y los valores del resto de columnas.
O bien solo los valores entre GeneID y HGNC, es decir, de una línea

Dbxref=GeneID:128869,HGNC:HGNC:15791,HPRD:12250,MIM:608528;Name=PIGU

obtener únicamente 128869 en esa columna y el resto intactas.

Si no es mucha molestia me sería de gran ayuda no solo para esta tabla si no para comprender mejor la línea de comandos.

Saludos.
Richard10
Perlero nuevo
Perlero nuevo
 
Mensajes: 8
Registrado: 2013-04-03 17:35 @774

Re: Edición en columna de tabla

Notapor explorer » 2016-09-08 16:03 @710

Richard10 escribiste:Pero si ahora solo quisiera quedarme con los datos posteriores a Name=, es decir, de una línea

Dbxref=GeneID:128869,HGNC:HGNC:15791,HPRD:12250,MIM:608528;Name=PIGU

mantener únicamente PIGU en esa columna y los valores del resto de columnas.

Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. perl -p -e 's/^.+;Name=([^\s"]+)"?/$1/' example.txt > salida.txt
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

En este caso, usamos como "ancla" el valor de 'Name=', y capturamos lo que le sigue, pero solo si no es ni espacios en blanco ni el carácter de comillas dobles.
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
  1. logFC   logCPM  PValue  FDR     IND.10.N.3_GCF  NOTRAT.1_GCF    IND.10.N.3_GCF  NOTRAT.1_GCF    DE      Regulation             
  2. LOC105370384    953     516     0.885105148     437     0.904246783     437.0008964     953     516     44.79746355     31.18396657     90.42
  3. PIGU    940     506     0.893523372     434     0.904221549     434.0009198     940     506     44.18637538     30.57962613     90.42
  4. CHST12  416     212     0.972519264     204     0.904208933     204.0023181     416     212     19.55482144     12.81201727     90.42
  5. ACSM1   851     455     0.903292587     396     0.904196316     396.0010302     851     455     40.00277175     27.4974899      90.42
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Richard10 escribiste:O bien solo los valores entre GeneID y HGNC, es decir, de una línea

Dbxref=GeneID:128869,HGNC:HGNC:15791,HPRD:12250,MIM:608528;Name=PIGU

obtener únicamente 128869 en esa columna y el resto intactas.

Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. perl -p -e 's/^.*?Dbxref=GeneID:(.+?)[,;].+?(?=\s)/$1/' example.txt > salida.txt
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Aquí usamos de "ancla" para buscar lo que queremos la cadena 'Dbxref=GeneID:', y capturamos todo lo que le sigue, pero hasta encontrar el primer carácter ',' o ';', y agregamos a la búsqueda todo el resto del campo, hasta encontrar el primer carácter de espacio, que no agregaremos a la operación de sustitución.
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
  1. logFC   logCPM  PValue  FDR     IND.10.N.3_GCF  NOTRAT.1_GCF    IND.10.N.3_GCF  NOTRAT.1_GCF    DE      Regulation             
  2. 105370384       953     516     0.885105148     437     0.904246783     437.0008964     953     516     44.79746355     31.18396657     90.42
  3. 128869  940     506     0.893523372     434     0.904221549     434.0009198     940     506     44.18637538     30.57962613     90.42
  4. 55501   416     212     0.972519264     204     0.904208933     204.0023181     416     212     19.55482144     12.81201727     90.42
  5. 116285  851     455     0.903292587     396     0.904196316     396.0010302     851     455     40.00277175     27.4974899      90.42
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Estas son otras opciones, en las que seguimos un orden de operaciones.
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. perl -n -E 'print and next if not /^(.*?Dbxref.+?)(\s.+)$/; ($campo1, $resto) = ($1, $2); $campo1 =~ s/^"|"$//g; $campo1 =~ s/^.+?Name=(.+)/$1/; say "$campo1$resto";' example.txt > salida.txt
  2.  
  3. perl -n -E 'print and next if not /^(.*?Dbxref.+?)(\s.+)$/; ($campo1, $resto) = ($1, $2); $campo1 =~ s/^"|"$//g; $campo1 =~ s/^.+?GeneID:(.+?)(?=[,;]).+?$/$1/; say "$campo1$resto";' example.txt > salida.txt
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

En estos casos, hacemos una serie de operaciones comunes:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. print and next if not /^(.*?Dbxref.+?)(\s.+)$/; # primero, imprimimos la línea y pasamos a la siguiente si el primer campo no contiene 'Dbxref')
  2. ($campo1, $resto) = ($1, $2);                   # luego, guardamos en dos variables las dos partes de la línea
  3. $campo1 =~ s/^"|"$//g;                          # del primer campo, le quitamos las comillas, si las tuviera
  4. $campo1 =~ s/^.+?Name=(.+)/$1/;                 # y ahora buscamos lo que queremos, y reducimos el primer campo a eso que encontremos
  5. print "$campo1$resto\n";                        # reconstruimos la salida
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Bioinformática

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 3 invitados

cron