web-dev-qa-db-fra.com

Supprimer tout le texte avant les deux points

J'ai un fichier contenant un certain nombre de lignes. Chaque ligne ressemble à ceci:

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

Je voudrais supprimer tout le caractère avant:: afin de ne conserver que PKMYT1 qui est un nom de gène. Puisque je ne suis pas un expert en scripts regex, est-ce que quelqu'un peut m'aider à faire cela en utilisant Unix (sed ou awk) ou en R?

36
Elb

Voici deux façons de le faire dans 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))
53
Sacha Epskamp

Une expression régulière simple utilisée avec gsub():

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

Voir ?regex ou ?gsub pour plus d'aide.

10
Andrie

Il y a certainement plus de 2 façons dans R. En voici une autre.

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

Si la chaîne a une longueur constante, j'imagine que substr serait plus rapide que cela ou les méthodes regex.

9
John

Utilisation de sed:

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

Ceci remplacera tout ce qui est suivi d'un point-virgule sans rien, donc tout sera supprimé, y compris le dernier deux-points de chaque ligne ( car * est glouton par défaut ).

Selon le commentaire de Josh O'Brien, si vous souhaitez uniquement remplacer jusqu'au premier côlon inclus, procédez comme suit:

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

Cela correspondra à tout ce qui n'est pas un colon, suivi d'un colon, et ne sera remplacé par rien.

Notez que pour ces deux modèles, ils s’arrêteront lors du premier match de chaque ligne. Si vous souhaitez effectuer un remplacement pour chaque correspondance d'une ligne, ajoutez l'option 'g' (global) à la fin de la commande.

Notez également que sur linux (mais pas sur OSX), vous pouvez éditer un fichier sur place avec -i, par exemple:

sed -i 's/.*://' your_file
8
John Carter

Vous pouvez utiliser awk comme ceci:

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

Si vous avez GNU coreutils disponible, utilisez cut:

cut -d: -f2 infile
2
Thor

Je travaillais sur un problème similaire. Les conseils de John et Josh O'Brien ont fait l'affaire. J'ai commencé avec ce tibble: 

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

Ça ressemble à:

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

J'avais besoin de créer ce tibble:

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

Et l'a fait avec ce code (R version 3.4.2).

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

Voici 2 solutions équivalentes:

La première utilise la fonctionnalité -a autosplit de Perl pour scinder chaque ligne en champs à l'aide de :, remplir le tableau de champs F et imprimer le deuxième champ $F[1] (compté à partir du champ 0)

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

La seconde utilise une expression régulière pour remplacer s/// à partir de ^ au début de la ligne, .*: tous les caractères se terminant par un signe deux-points, sans rien

Perl -pe 's/^.*://' file
0
Chris Koknat

Un geste très simple qui me manquait de la meilleure réponse @Sacha Epskamp consistait à utiliser la sous-fonction, dans ce cas tout prendre avant le ":" (au lieu de le supprimer), donc c'était très 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)

Fondamentalement, la même chose, il suffit de changer la position ":" dans le sous-argument. J'espère que ça va aider.