Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 24/09/2015, à 12: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, à 17:28)

Hors ligne

#2 Le 24/09/2015, à 12: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, à 12: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

En ligne

#4 Le 24/09/2015, à 17: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, à 18:51

nany

Re : commande sed:remplacer mot par un autre selon une liste d'associations

jibbah a écrit :

@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, à 18:55

pingouinux

Re : commande sed:remplacer mot par un autre selon une liste d'associations

jibbah #4 a écrit :

@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, à 11:13)

En ligne

#7 Le 19/10/2015, à 10: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, à 11: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