Eliminar todo el texto antes del colon

Tengo un archivo que contiene una cierta cantidad de líneas. Cada línea se ve así:

TF_list_to_test10004/Nus_k0.345_t0.1_e0.1.adj:PKMYT1 

Me gustaría eliminar todo el carácter anterior a “:” para retener solo PKMYT1 que es un nombre de gen. Como no soy un experto en scripting regex, ¿alguien puede ayudarme a hacer esto usando Unix (sed o awk) o en R?

Aquí hay dos formas de hacerlo en R:

 foo <- "TF_list_to_test10004/Nus_k0.345_t0.1_e0.1.adj:PKMYT1" # Remove all before and up to ":": gsub(".*:","",foo) # Extract everything behind ":": regmatches(foo,gregexpr("(?<=:).*",foo,perl=TRUE)) 

Una expresión regular simple utilizada con gsub() :

 x <- "TF_list_to_test10004/Nus_k0.345_t0.1_e0.1.adj:PKMYT1" gsub(".*:", "", x) "PKMYT1" 

Consulte ?regex ?gsub o ?gsub para obtener más ayuda.

Ciertamente hay más de 2 formas en R. Aquí hay otra.

 unlist(lapply(strsplit(foo, ':', fixed = TRUE), '[', 2)) 

Si la cadena tiene una longitud constante, imagino que substr sería más rápido que este o los métodos regex.

Usando sed:

 sed 's/.*://' < your_input_file > output_file 

Esto reemplazará cualquier cosa seguida de dos puntos sin nada, por lo que eliminará todo, incluidos los últimos puntos en cada línea ( porque * es codicioso de forma predeterminada ).

Según el comentario de Josh O’Brien, si solo desea reemplazar hasta los primeros dos puntos, haga esto:

 sed "s/[^:]*://" 

Eso coincidirá con cualquier cosa que no sea un colon, seguido de un punto y no se reemplazará con nada.

Tenga en cuenta que para ambos patrones se detendrán en la primera coincidencia de cada línea. Si desea hacer una sustitución por cada coincidencia en una línea, agregue la opción ‘ g ‘ (global) al final del comando.

También tenga en cuenta que en Linux (pero no en OSX) puede editar un archivo in situ con -i por ejemplo:

 sed -i 's/.*://' your_file 

Puedes usar awk así:

 awk -F: '{print $2}' /your/file 

Si tiene GNU coreutils disponibles use use cut :

 cut -d: -f2 infile 

A continuación hay 2 soluciones equivalentes:

El primero usa la característica de autofecilación de perl para dividir cada línea en campos usando : poblar el conjunto de campos F e imprimir el segundo campo $F[1] (contado a partir del campo 0)

 perl -F: -lane 'print $F[1]' file 

El segundo usa una expresión regular para sustituir s/// desde ^ el comienzo de la línea .*: Cualquier carácter que termine con dos puntos, sin nada

 perl -pe 's/^.*://' file 

Estaba trabajando en un problema similar. El consejo de John y Josh O’Brien fue el truco. Empecé con este tibble:

 library(dplyr) my_tibble <- tibble(Col1=c("ABC:Content","BCDE:MoreContent","FG:Conent:with:colons")) 

Parece que:

  | Col1 1 | ABC:Content 2 | BCDE:MoreContent 3 | FG:Content:with:colons 

Necesitaba crear este tibble:

  | Col1 | Col2 | Col3 1 | ABC:Content | ABC | Content 2 | BCDE:MoreContent | BCDE | MoreContent 3 | FG:Content:with:colons| FG | Content:with:colons 

Y lo hizo con este código (R versión 3.4.2).

 my_tibble2 <- mutate(my_tibble ,Col2 = unlist(lapply(strsplit(Col1, ':',fixed = TRUE), '[', 1)) ,Col3 = gsub("^[^:]*:", "", Col1)) 

Un movimiento muy simple que me perdí de la mejor respuesta @Sacha Epskamp fue usar la función secundaria, en este caso para tomar todo antes del “:” (en lugar de eliminarlo), así que fue muy simple:

 foo <- "TF_list_to_test10004/Nus_k0.345_t0.1_e0.1.adj:PKMYT1" # 1st, as she did to remove all before and up to ":": gsub(".*:","",foo) # 2nd, to keep everything before and up to ":": gsub(":.*","",foo) 

Básicamente, lo mismo, simplemente cambie la posición ":" dentro del argumento secundario. Espero que ayude