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?
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))
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.
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.
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
Vous pouvez utiliser awk
comme ceci:
awk -F: '{print $2}' /your/file
Si vous avez GNU coreutils
disponible, utilisez cut
:
cut -d: -f2 infile
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))
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
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.