#1 Le 24/09/2015, à 11:06
- jibbah
commande sed:remplacer mot par un autre selon une liste d'associations
Bonjour,
je souhaiterais remplacer des mots dans le document de type phylofile:
(LEP2326_Raphiptera_argillaceella:0.13456408760380955680,MM03362_Crambus_uliginosellus:0.04135512507247578184)93:0.01270061590089223251)100:0.05197454443661148060)98:0.03296567637929526812)
par d'autres mots, selon une liste d'associations définie dans un document replace_name:
LEP2326_Raphiptera_argillaceella Raphiptera_argillaceellus
MM03362_Crambus_uliginosellus Crambus_perlellus
de sorte à obtenir le document output:
(Raphiptera_argillaceellus:0.13456408760380955680,Crambus_perlellus:0.04135512507247578184)93:0.01270061590089223251)100:0.05197454443661148060)98:0.03296567637929526812)
J'ai un tableau de 70 noms avec leurs noms associés. J'ai écrit le script suivant intuitivement, mais je n'arrive pas au résultat voulu (l'erreur vient entre-autre du fait que je ne puisse apparemment pas utiliser la variable $line dans la commande cut pour définir une autre variable):
for line in replace_name
do rename_what= $(cut -f -1 $line)
rename_with=$(cut -f -1 $line)
sed -i -e "$rename_what/$rename_with/g" phylofile
done
Merci pour votre aide
Dernière modification par jibbah (Le 24/09/2015, à 16:28)
Hors ligne
#2 Le 24/09/2015, à 11:18
- nany
Re : commande sed:remplacer mot par un autre selon une liste d'associations
Bonjour,
cut va rechercher un fichier donné par la variable $line. Essaye comme ça :
for line in replace_name
do
rename_what= $(echo $line | cut -f 1)
rename_with=$(echo $line | cut -f 2)
sed -i -e "$rename_what/$rename_with/g" phylofile
done
Je n’ai pas testé.
Hors ligne
#3 Le 24/09/2015, à 11:26
- pingouinux
Re : commande sed:remplacer mot par un autre selon une liste d'associations
Bonjour,
Essaye ceci
sed $(while read n1 n2;do echo "-e s/$n1/$n2/g";done <replace_name) fichier
Hors ligne
#4 Le 24/09/2015, à 16:27
- jibbah
Re : commande sed:remplacer mot par un autre selon une liste d'associations
Merci à vous deux,
@nany: j'obtiens le message d'erreur suivant: "./phylotree_replace_names.sh: ligne 12: replace_name : commande introuvable", correspondant à la ligne
rename_what= $(echo $line | cut -f 1)
@pingouinux: j'ai essayé ta commande dans un script et ca m'a retourné "sed: -e expression n°1, caractère 39: commande `s' inachevée"
Hors ligne
#5 Le 24/09/2015, à 17:51
- nany
Re : commande sed:remplacer mot par un autre selon une liste d'associations
@nany: j'obtiens le message d'erreur suivant: "./phylotree_replace_names.sh: ligne 12: replace_name : commande introuvable", correspondant à la ligne
rename_what= $(echo $line | cut -f 1)
Selon moi, l’erreur vient plutôt de cette ligne où j’avais en effet un doute sur le résultat de sa syntaxe :
for line in replace_name
Il aurait fallu utiliser :
for line in $(cat replace_name)
Mais le while read proposé par pingouinux est préférable :
while read rename_what rename_with
do
sed -i -e "$rename_what/$rename_with/g" phylofile
done <replace_name
Hors ligne
#6 Le 24/09/2015, à 17:55
- pingouinux
Re : commande sed:remplacer mot par un autre selon une liste d'associations
@pingouinux: j'ai essayé ta commande dans un script et ca m'a retourné "sed: -e expression n°1, caractère 39: commande `s' inachevée"
Je suis surpris, à moins qu'il n'y ait des caractères bizarres dans replace_name.
$ cat fichier
(LEP2326_Raphiptera_argillaceella:0.13456408760380955680,MM03362_Crambus_uliginosellus:0.04135512507247578184)93:0.01270061590089223251)100:0.05197454443661148060)98:0.03296567637929526812)
$ cat replace_name
LEP2326_Raphiptera_argillaceella Raphiptera_argillaceellus
MM03362_Crambus_uliginosellus Crambus_perlellus
$ sed $(while read n1 n2;do echo "-e s/$n1/$n2/g";done <replace_name) fichier
(Raphiptera_argillaceellus:0.13456408760380955680,Crambus_perlellus:0.04135512507247578184)93:0.01270061590089223251)100:0.05197454443661148060)98:0.03296567637929526812)
Édité :
Si le fichier replace_name est long, ma commande sed va générer une ligne trop longue, mais je ne pense pas qu'on aurait eu ce message.
Dans ce cas, utilise la commande de nany #5 qui effectue les remplacements un par un (j'ai rajouté le s/ qui manquait en début d'expression) :
while read rename_what rename_with
do
sed -i -e "s/$rename_what/$rename_with/g" phylofile
done <replace_name
Dernière modification par pingouinux (Le 25/09/2015, à 10:13)
Hors ligne
#7 Le 19/10/2015, à 09:21
- jibbah
Re : commande sed:remplacer mot par un autre selon une liste d'associations
Merci pour les réponses, qui fonctionnent parfaitement. Pour information, une commande awk m'a également été suggérée:
awk '
NR==FNR{ map["\\<"$1"\\>"]=$2; next }
{
for (old in map) {
new = map[old]
gsub(old,new)
}
print
}
' replace_name phylofile >> input_figtree
Hors ligne
#8 Le 24/10/2015, à 10:03
- credenhill
Re : commande sed:remplacer mot par un autre selon une liste d'associations
hello
autre méthode
sed 's+.*+s/&/g+;s+ +/+' replace_name | sed -f - phylofile >> input_figtree
Hors ligne