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

Shell et commandes GNU Discussion :

Concaténer - Paste


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Février 2012
    Messages : 8
    Par défaut Concaténer - Paste
    Bonjour à tous,

    J'ai un petit problème. En faite j'ai un fichier et à chaque nom correspond un chiffre, et je souhaiterais que lors d'une recherche du nombre 414 par exemple, mon script me retourne titi.
    Mon fichier 1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    toto titi tata tutu 
    121 235 414 541
    Donc pour moi la solution serai d'avoir quelque chose de ce genre là:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    toto 121
    ...
    tutu 541
    Après j’extrait avec un grep.

    Donc pour se faire, je pense extraire la premier ligne dans un fichier1, la deuxieme ligne dans un fichier2 et rassemblait tout ça avec paste.

    Mais je ne sais pas comment faire et je n'ai pas d'autres idée de comment m'y prendre.

    Merci

  2. #2
    Expert confirmé Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Par défaut
    avec sed tu peux choisir la ligne correspondante puis garder que la colone qui t'interesse


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    $ cd /tmp
    $ cat > toto
    toto 121
    ...
    tutu 541
    $ 
    $ xx=541
    $ sed  "/$xx/ !d ; s/\(.*\) $xx/\1/" toto
    tutu
    $
    en clair le sed supprime toute ligne qui contient pas 541
    ensuite substitue ce qui precede 541 par que ce qui precede (syntaxe complete) juste pour comprendre
    mais qui peut en réalité se résumer à substituer 541 par "rien"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     sed  "/$xx/ !d ; s/$xx//" toto

    bien sur tu peux charger le resultat sur une variable et en faire ce que tu veux...

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 833
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 833
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Diakt Voir le message
    Bonjour à tous,

    J'ai un petit problème. En faite j'ai un fichier et à chaque nom correspond un chiffre, et je souhaiterais que lors d'une recherche du nombre 414 par exemple, mon script me retourne titi.
    Mon fichier 1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    toto titi tata tutu 
    121 235 414 541
    Donc pour moi la solution serai d'avoir quelque chose de ce genre là:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    toto 121
    ...
    tutu 541
    Après j’extrait avec un grep.
    Salut
    Bon, sans optimiser car fait à la va-vite
    Si ton fichier contient x mots puis x valeurs
    Code sh : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #!/bin/sh
    lig1=$(head -1 fichier |tail -1)
    lig2=$(head -2 fichier |tail -1)
    set $lig1
    i=1
    while test $i -lt $#
    do
        echo "$(echo $lig1 |cut -f$i -d' ') $(echo $lig2 |cut -f$i -d' ')"
        i=$(expr $i + 1)
    done

    Ecrit en pure Bourne shell. Maintenant j'ai confiance, je suis sûr que N_Bah va te trouver la même chose en 1/2 ligne de script bash...

    Citation Envoyé par Diakt Voir le message
    Donc pour se faire, je pense extraire la premier ligne dans un fichier1, la deuxieme ligne dans un fichier2 et rassemblait tout ça avec paste.
    Moui. On peut le faire mais faut se méfier des fichiers temporaires car
    1) lourd (accès disques)
    2) danger de collision (avec un autre script utilisant le même fichier ou, pire, le même script lancé plusieurs fois dans différents processus)
    Donc quand je peux éviter j'aime autant...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 654
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 654
    Par défaut
    Bonjour,

    en 1/2 ligne, je n'ai pas encore trouvé, mais j'y travaille

    Code BASH : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ id=414
    $ { read -a noms; read -a ids;} < fichierDiakt
    $ for ((x=0; x<${#noms[@]}; x++)); do (( ${ids[x]} == $id && (v=1))) && echo "${noms[x]}"; done
    $ ((v)) || echo "$id : pas de correspondance"
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Par défaut
    Bonjour,

    Alternative awk:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ ID=414
    $ awk '{split($0,s," ");getline;for(i in s)if($i==id) print s[i],$i}' id=$ID fichier

  6. #6
    Membre régulier
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Février 2012
    Messages : 8
    Par défaut
    Merci à tous !! Ces exactement ce dont j'avais besoin, je ne connais pas la commande awk mais en la testant je la trouve super pratique

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 833
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 833
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Diakt Voir le message
    je ne connais pas la commande awk mais en la testant je la trouve super pratique
    Il s'agit d'une commande permettant de programmer un algorithme complet de traitement de fichiers

    syntaxe: awk -F caractère_séparant_chaque_mot '{algorithme}' fichier.

    awk se chargera de lire le fichier et, pour chaque ligne, déroulera l'algorithme situé entre les accolades. Dans cet algorithme programmable via séquences structurées semblables au C (if(), while(), for()), chaque mot est identifié par $x ($1 premier mot, $2 second mot etc...); $0 identifie la ligne entière et NF identifie le nombre de mots (et NR le n° de la ligne en cours). A toi de lui spécifier comment il doit découper les mots (par exemple pour traiter /etc/passwd il faudra lui dire que les mots sont séparés par ":" => awk -F: '{...}' /etc/passwd) puis de programmer le traitement à appliquer sur ces mots. Le résultat du traitement étant renvoyé à l'écran (via instruction "print" ou "printf()" que tu places où tu veux, tu peux le rediriger ensuite vers un autre fichier.

    Si l'algorithme devient trop gros pour être écrit dans la ligne de commande, tu peux l'écrire dans un fichier à part (conventionnellement nommé ".awk"). Là tu peux prendre tes aises pour l'écrire lisiblement ton algo sur plusieurs lignes avec indentation de blocs (comme un source C). Ensuite tu indiques à awk où se trouve le fichier algo via l'option -f fichier.awk

    Un outil puissant mais, fatalement comme tout outil puissant, lourd à se charger. Donc à éviter si possible quand le traitement voulu est assez simple et peut être remplacé par des outils plus légers (grep, sed, cut, tr, ...) surtout si le traitement est lui-même inclus dans une boucle shell...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

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

Discussions similaires

  1. Concaténation de 2 select en 1 seul
    Par Fleep dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 08/08/2003, 11h38
  2. Char(x) -> chaine concaténée d'espaces ?
    Par rgz dans le forum Débuter
    Réponses: 7
    Dernier message: 27/06/2003, 11h59
  3. Concaténation vertical ???
    Par loaded dans le forum Langage SQL
    Réponses: 10
    Dernier message: 07/05/2003, 15h44
  4. Concaténer TStrings
    Par Tuxxy dans le forum Composants VCL
    Réponses: 8
    Dernier message: 07/03/2003, 12h30
  5. Concaténation de String et Integer
    Par Ingham dans le forum Langage
    Réponses: 5
    Dernier message: 21/01/2003, 17h26

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