IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Linux Discussion :

Remplacement de caracteres dans une ligne


Sujet :

Linux

  1. #1
    Membre à l'essai
    Inscrit en
    Mai 2004
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 36
    Points : 20
    Points
    20
    Par défaut Remplacement de caracteres dans une ligne
    bonjour,

    voila mon probleme j'ai un fichier avec plusieurs lignes de ce type :

    xx xx;yy yyy;eee ee;100 000;20 000
    et j'aimerais pouvoir supprimer les espaces mais que pour les 2 derniers champs. J'ai pensé utiliser sed ou tr mais je ne sais/trouve pas si on peut lui demandser de remplacer a partir d'un certain champs dans une ligne..

    quelqu'un peut 'il m'aider .?

    merci beaucoup

  2. #2
    Membre à l'essai
    Inscrit en
    Juin 2005
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 14
    Points : 17
    Points
    17
    Par défaut
    Tu peux utiliser awk.
    Le numéro du dernier champ de la ligne est donné par la variable NF.

  3. #3
    Membre expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Points : 3 166
    Points
    3 166
    Par défaut Re: [shell] remplacement de caracteres dans une ligne
    Citation Envoyé par tibyann
    J'ai pensé utiliser sed ou tr mais je ne sais/trouve pas si on peut lui demandser de remplacer a partir d'un certain champs dans une ligne...
    J'aurai plutôt tendance à utiliser awk pour ce genre de traitement.

    On peut indiquer le séparateur de champs, en entrée comme en sortie, pour indiquer que c'est un ;

    On peut choisir les champs sur lesquels travailler, numérotés de 1 à NF

    La modification d'un champ est répercutée sur l'ensemble de la ligne contenue dans $0

    On a une substitution par expression régulière possible sur les champs...

    Ca donnerait un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo "xx xx;yy yyy;eee ee;100 000;20 000" | awk -F ";" -vOFS=";" '{ gsub (/ /, "_", $(NF-1)); print $0 }'
    A complèter ...
    La FAQ Perl est par ici
    : La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !

  4. #4
    Membre confirmé
    Avatar de bster
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    372
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2005
    Messages : 372
    Points : 497
    Points
    497
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    /tmp>echo "xx xx;yy yyy;eee ee;100 000;20 000" | awk -F ";" -vOFS=";" '{ gsub (/ /, "", $(NF-1)); gsub (/ /,"", $(NF)); print $0 }' 
    xx xx;yy yyy;eee ee;100000;20000

    voilà pour les deux suffit de metre deux gsub et "" pour éliminer l'espace plustot que le remplacer si c'est ça le but.
    Comité de lutte contre le langage SMS sur les forums
    Veuillez écrire dans un langage compréhensible par les humains, merci.

  5. #5
    Membre à l'essai
    Inscrit en
    Mai 2004
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 36
    Points : 20
    Points
    20
    Par défaut
    merci pour vos réponses

    seulement j'ai un petit probleme avec votre solution... elle m'enleve tous les ;

    je suis sous solaris et pour utiliser votre méthode je dois utiliser nawk, je ne sais pas si c'est ca qui pose probleme

    voila mon code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo "xxx xxx;eeeeee;kkkk;10 00;20 000; 30 000" | nawk -F ";" -vOFS=";" '{ for (i=4;i<=NF;i++) {gsub (/ /, "", $i) }; print $0 }'
    et le résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xxx xxx eeeeee kkkk 1000 20000 30000
    pouvez vous m'aider ? merci

  6. #6
    Modérateur
    Avatar de ggnore
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 472
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 472
    Points : 4 029
    Points
    4 029
    Par défaut
    le print d'awk peut se transformer en printf.
    Ce qui veut dire que tu peux formater à loisir.
    Tout dépend du format d'arrivée que tu veux.
    Mais si tu rajoutess un \n dans un printf pour chaque champs récupéré, tu devrais pouvoir t'en sortir.
    Toutes les vertus des hommes se perdent dans l’intérêt comme les fleuves se perdent dans la mer.
    N'oubliez pas de consulter les FAQ Linux et les cours et tutoriels Linux

  7. #7
    Membre à l'essai
    Inscrit en
    Mai 2004
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 36
    Points : 20
    Points
    20
    Par défaut
    Citation Envoyé par ggnore
    le print d'awk peut se transformer en printf.
    Ce qui veut dire que tu peux formater à loisir.
    Tout dépend du format d'arrivée que tu veux.
    Mais si tu rajoutess un \n dans un printf pour chaque champs récupéré, tu devrais pouvoir t'en sortir.
    je dois dire que je ne suis pas sur d'avoir compris ta réponse ..

    à l'arrivée je voudrais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xxx xxx;eeeeee;kkkk;1000;20000;30000

  8. #8
    Membre expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Points : 3 166
    Points
    3 166
    Par défaut
    Citation Envoyé par tibyann
    je suis sous solaris et pour utiliser votre méthode je dois utiliser nawk, je ne sais pas si c'est ca qui pose probleme
    N'ayant pas solaris, je ne peux t'aider davantage, mais le problème que tu décris est celui que j'ai lorsque je ne fais pas le -vOFS=";" à la ligne de commande

    Tu dois pouvoir remplacer ça par un OFS=";"; juste avant le print, dans l'expression awk.

    Sinon, regarde dans le man de nawk pour savoir comment changer la valeur du Output Field Separator (OFS )
    La FAQ Perl est par ici
    : La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !

  9. #9
    Membre à l'essai
    Inscrit en
    Mai 2004
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 36
    Points : 20
    Points
    20
    Par défaut
    oki merci pour ta réponse, je vais regarder tout ca

  10. #10
    Modérateur
    Avatar de ggnore
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 472
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 472
    Points : 4 029
    Points
    4 029
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ echo "xxx xxx;eeeeee;kkkk;10 00;20 000; 30 000" | nawk -F ";" -vOFS=";" '{ for (i=4;i<=NF;i++) {gsub (/ /, "", $i) }; print $0 }'
    xxx xxx;eeeeee;kkkk;1000;20000;30000
    ça ne fonctionne qu'avec les entiers.

    Bon, j'avoue ne pas maîtriser awk des masses.

    voici ce que j'aurai fait avec tr:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ echo "xxx xxx;eeeeee;kkkk;10 00;20 000; 30 000" | tr -d " "
    xxxxxx;eeeeee;kkkk;1000;20000;30000
    ou avec sed
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ echo "xxx xxx;eeeeee;kkkk;10 00;20 000; 30 000" | sed 's/ //g'
    xxxxxx;eeeeee;kkkk;1000;20000;30000
    C'est pas toujours évident avec les versions des outils des unix.
    Toutes les vertus des hommes se perdent dans l’intérêt comme les fleuves se perdent dans la mer.
    N'oubliez pas de consulter les FAQ Linux et les cours et tutoriels Linux

  11. #11
    Membre à l'essai
    Inscrit en
    Mai 2004
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 36
    Points : 20
    Points
    20
    Par défaut
    ok merci pour vos réponse, mon probleme est résolu

    voici ma solution

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo "xxx xxx;eeeeee;kkkk;10 00;20 000; 30 000" | nawk -F ";" '{ for (i=4;i<=NF;i++) {gsub (/ /, "", $i) }; OFS=";"; print $0 }'
    ggnore, le probleme avec sed et tr est qu'il m'enlevais tous les espaces, ce que je ne voulais pas, je ne voulais les enlever qu'a partir d'un certain champs de ma ligne .

    merci encore

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. supprimer une chaine de caractere dans une ligne.
    Par wadabush dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 11/02/2009, 20h59
  2. rechercher et remplacer un caractere dans une base de données
    Par trialrofr dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 29/01/2009, 10h07
  3. remplacement de caractere ' dans une chaine
    Par bab_dev dans le forum Ruby on Rails
    Réponses: 2
    Dernier message: 24/01/2008, 14h12
  4. remplacer un mot dans une ligne
    Par italiasky dans le forum Shell et commandes GNU
    Réponses: 12
    Dernier message: 08/04/2007, 19h19
  5. Réponses: 2
    Dernier message: 06/02/2007, 22h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo