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 :

Traitement des colonnes de deux fichiers


Sujet :

Shell et commandes GNU

  1. #1
    Nouveau membre du Club
    Femme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 37
    Points : 27
    Points
    27
    Par défaut Traitement des colonnes de deux fichiers
    Bonjour tout le monde

    J'ai une question !!

    j'ai deux fichiers
    fichier1:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    rep rep distRepRep
    R1   R2  d1
    R1   R3  d2
    R1   R4  d3
    R1   R5  d4
    R2   R3  d5
    R2   R4  d6
    R2   R5  d7
    R3   R4  d8
    R3   R5  d9
    R4   R5  d10
    fichier2:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    rep rayon
    R1  r1
    R2  r2
    R3  r3
    R4  r4
    R5  r5
    je veux afficher le traitement çi dessous:

    si r1+r2<d1 afficher: R1 et R2 ne se chevauchent pas
    si r2+r3<d5 afficher: R2 et R3 ne se chevauchent pas
    ect
    si non elles se chevauchent

    Est ce que c'est possible de faire ce traitement en bash directement? si oui, comment procéder?
    ou il faut passé par un petit script en python ou perl

    Merci par avance

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Bonjour.
    J'ai un peu de mal à comprendre les spécifications!

    Citation Envoyé par BIG123 Voir le message
    J'ai une question !!
    Tu fais bien de le préciser!

    j'ai deux fichiers
    fichier1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    rep rep distRepRep
    R1   R2  d1
    R1   R3  d2
    R1   R4  d3
    R1   R5  d4
    R2   R3  d5
    R2   R4  d6
    R2   R5  d7
    R3   R4  d8
    R3   R5  d9
    R4   R5  d10
    fichier2:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    rep rayon
    R1  r1
    R2  r2
    R3  r3
    R4  r4
    R5  r5
    je veux afficher le traitement çi dessous:

    si r1+r2<d1 afficher: R1 et R2 ne se chevauchent pas
    si r2+r3<d2 afficher: R2 et R3 ne se chevauchent pas
    Quelle est la corrélation entre r1 r2 d1 et les fichiers?
    La relation r1+r2<d1 émane-t-elle de la première ligne de fichier1 R1 R2 d1 ?

    Si oui, la 2ème relation ne devrait-elle pas être r1+r3<d2 au lieu de r2+r3<d2 ???

    Si c'est bien le cas, veux-tu dire que chaque ligne "Ri Rj dk" du fichier1 représente une relation "ri + rj < dk" ?

    Si oui, c'est très facile en bash:
    Tu lis le fichier2 (sauf la première ligne) en remplaçant " " par "=" et en utilisant 'eval' pour affecter les valeurs ri aux variables Ri.
    puis tu lis le fichier1 en remplaçant chaque ligne "Ri Rj dk" par quelque chose comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if [[ $((Ri + Rj)) -lt dk ]] ; then ...

  3. #3
    Nouveau membre du Club
    Femme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 37
    Points : 27
    Points
    27
    Par défaut
    oui j'ai fais une erreur (j'ai réctifié)
    effectivement si r2+r3<d5 afficher: R2 et R3 ne se chevauchent pas
    ou encore comme ce que tu as écris

    PS: je n'ai pas la première ligne dans mes deux fichiers je les ai écrit pour être plus explicite.
    Je ne connais pas grand chose sous bash veuillez être plus explicite svp
    Merci

  4. #4
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par BIG123 Voir le message
    oui j'ai fais une erreur
    effectivement si r2+r3<d5 afficher: R2 et R3 ne se chevauchent pas
    ou encore comme ce que tu as écris

    PS: je n'ai pas la première ligne dans mes deux fichiers je les ai écrit pour être plus explicite.
    Je ne connais pas grand chose sous bash veuillez être plus explicite svp
    Merci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ cat fichier1
    R1  3
    R2  5
    R3  1
    R4  6
    R5  2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $ cat fichier2
    R1   R2  1
    R1   R3  2
    R1   R4  3
    R1   R5  4
    R2   R3  5
    R2   R4  6
    R2   R5  7
    R3   R4  8
    R3   R5  9
    R4   R5  10
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $ ./dist_comp.sh
    R1 et R2 se chevauchent
    R1 et R3 se chevauchent
    R1 et R4 se chevauchent
    R1 et R5 se chevauchent
    R2 et R3 se chevauchent
    R2 et R4 se chevauchent
    R2 et R5 se chevauchent
    R3 et R4 ne se chevauchent pas
    R3 et R5 ne se chevauchent pas
    R4 et R5 ne se chevauchent pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $ cat ./dist_comp.sh
    #!/bin/ksh
     
    eval $(sed -e 's/  */=/' fichier1)
     
    while read Ri Rj Dk ; do
        [[ $(($Ri + $Rj)) -lt $Dk ]]	\
            && print "$Ri et $Rj ne se chevauchent pas"	\
            || print "$Ri et $Rj se chevauchent"
    done < fichier2

  5. #5
    Expert éminent

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Points : 6 276
    Points
    6 276
    Par défaut
    Salut jack-ft,

    Aurais-tu l'amabilité de m'expliquer les tenants et aboutissants de eval $(sed -e 's/ */=/' fichier1) s'il te plaît ? J'avoue ne pas en saisir la moindre utilité

    Merci
    $ man woman
    Il n'y a pas de page de manuel pour woman.

  6. #6
    Nouveau membre du Club
    Femme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 37
    Points : 27
    Points
    27
    Par défaut
    @jack-ft merci bcp pour ta réponse elle marche très bien
    mais j'aimerai bien comprendre d'avantage la première ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    eval $(sed -e 's/  */=/' fichier1)
    (vu mes connaissances très limitées dans les scripts shell.

  7. #7
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par zipe31 Voir le message
    Salut jack-ft,

    Aurais-tu l'amabilité de m'expliquer les tenants et aboutissants de eval $(sed -e 's/ */=/' fichier1) s'il te plaît ? J'avoue ne pas en saisir la moindre utilité

    Merci
    Ben... si tu n'en vois pas la moindre utilité, je t'invite à tester en commentant la ligne!!!

    Citation Envoyé par BIG123 Voir le message
    @jack-ft merci bcp pour ta réponse elle marche très bien
    mais j'aimerai bien comprendre d'avantage la première ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    eval $(sed -e 's/  */=/' fichier1)
    (vu mes connaissances très limitées dans les scripts shell.
    @BIG123 et zipe31: Je vous invite aussi à tester en mode debug ksh -x ./dist_comp.sh pour voir plus précisément ce que fait le script! Je trouve que c'est assez instructif.

    Sinon vous pouvez aussi vous référer à ma première réponse rapide:

    Citation Envoyé par jack-ft Voir le message
    Tu lis le fichier2 (sauf la première ligne) en remplaçant " " par "=" et en utilisant 'eval' pour affecter les valeurs ri aux variables Ri.
    sauf qu'en cours de route, j'ai permuté fichier1 et fichier2...

    Est-ce plus clair?

  8. #8
    Expert éminent

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Points : 6 276
    Points
    6 276
    Par défaut
    Citation Envoyé par jack-ft Voir le message
    Ben... si tu n'en vois pas la moindre utilité, je t'invite à tester en commentant la ligne!!!
    Testé et vu, shame on me

    source <(sed -e 's/ */=/' fichier1) aurait été plus parlant, du moins pour moi
    $ man woman
    Il n'y a pas de page de manuel pour woman.

  9. #9
    Nouveau membre du Club
    Femme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 37
    Points : 27
    Points
    27
    Par défaut
    Merci bcp c'est plus clair.

  10. #10
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par zipe31 Voir le message
    Testé et vu, shame on me
    Y a pas de mal! J'en ai eu fait des kisompir...

    source <(sed -e 's/ */=/' fichier1) aurait été plus parlant, du moins pour moi
    Super parlant, en effet!!! du moins pour moi

    Comme je ne fais que du ksh (et, en plus, seulement la partie compatible ksh88 pdksh mksh sous linux AIX HPUX et Solaris), je n'utilise pas cette syntaxe!

    Et c'est vrai qu'avec une indirection, j'ai un peu tendance à me brancher tout de suite sur 'eval'.

    Sinon, on aurait pu aussi créer un fichier intermédiaire et l'exécuter (ou le sourcer). Le fichier intermédiaire est pratique pour la mise au point...

  11. #11
    Nouveau membre du Club
    Femme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 37
    Points : 27
    Points
    27
    Par défaut
    Si j'ajoute un autre élement:
    si r1+r2=d1 afficher R1 et R2 sont limites
    ect

    et si je veux inclure c'est conditions également:
    si j'ai chevauchement afficher R1 et R2 se chevauchent d'une distance=d1-r1-r2 ect
    si je n'ai pas de chevauchement R1 et R2 sont distantes d'une distance =r1+r2-d1 ect

    je ne sais pas comment inclure ces conditions

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

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Points : 1 206
    Points
    1 206
    Par défaut
    Alternative awk:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk 'NR==FNR{a[$1]=$2;next}{s=a[$1]+a[$2]<=$3?a[$1]+a[$2]==$3?"limite":"pas de ch.":"chevauchement";print $0,s}' f1 f2
    Et si on n'aime pas trop les opérateurs ternaires, voici le développement du one-liner en plus classique:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    NR==FNR {
    	a[$1]=$2;next
    }
    {
    	if (a[$1]+a[$2]<=$3){
    		if(a[$1]+a[$2]==$3){
    			s="limite"
    		} else {
    			s="pas de ch."
    		}
    	} else {
    		s ="chevauchement"
    	}
    	print $0,s
    }
    :q :q! :wq :w :w! :wq! :quit :quit! :help help helpquit quit quithelp
    :quitplease :quitnow :leave :shit ^X^C ^C ^D ^Z ^Q QUITDAMMIT
    Jabber: ripat at im.apinc.org

  13. #13
    Nouveau membre du Club
    Femme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 37
    Points : 27
    Points
    27
    Par défaut
    En fait ce que je veux afficher c'est ça:

    si r1+r2<d1 afficher: "R1 et R2 ne se chevauchent pas et ils sont distant de: r1+r2-d1"
    si r2+r3<d5 afficher: "R2 et R3 ne se chevauchent pas et ils sont distant de: r2+r3-d5"
    ect
    si r1+r2>d1 afficher: "R1 et R2 se chevauchent avec une sitance de: d1-r1-r2"
    si r2+r3>d5 afficher: "R2 et R3 se chevauchent avec une distance de: d5-r1-r2"
    ect
    si r1+r2=d1 afficher: "R1 et R2 sont limite"
    si r2+r3=d5 afficher: "R2 et R3 sont limite"
    ect

    Merci

  14. #14
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par BIG123 Voir le message
    En fait ce que je veux afficher c'est ça:

    si r1+r2<d1 afficher: "R1 et R2 ne se chevauchent pas et ils sont distant de: r1+r2-d1"
    si r2+r3<d5 afficher: "R2 et R3 ne se chevauchent pas et ils sont distant de: r2+r3-d5"
    ect
    si r1+r2>d1 afficher: "R1 et R2 se chevauchent avec une sitance de: d1-r1-r2"
    si r2+r3>d5 afficher: "R2 et R3 se chevauchent avec une distance de: d5-r1-r2"
    ect
    si r1+r2=d1 afficher: "R1 et R2 sont limite"
    si r2+r3=d5 afficher: "R2 et R3 sont limite"
    ect

    Merci
    L'adaptation est assez simple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    $ cat ./dist_comp.sh
    #!/bin/ksh
     
    eval $(sed -e 's/  */=/' fichier1)
     
    while read Ri Rj Dk ; do
        d=$(($Ri + $Rj - Dk))
        if [[ $d -gt 0 ]]
        then print "$Ri et $Rj ne se chevauchent pas et ils sont distants de: $d"
        elif [[ $d -lt 0 ]]
        then print "$Ri et $Rj se chevauchent avec une distance de: $((-d))"
        else print "$Ri et $Rj sont limite"
        fi
    done < fichier2
    PS: j'ai pris la liberté d'ajouter un 's' à 'sont distant'...

  15. #15
    Nouveau membre du Club
    Femme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 37
    Points : 27
    Points
    27
    Par défaut
    Ah oui, c'est vrai!!
    moi le: je l'ai mis avec un "if" c'est pourquoi ça n'a pas marché..

    Merci encore une fois

  16. #16
    Nouveau membre du Club
    Femme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 37
    Points : 27
    Points
    27
    Par défaut
    Quand je mets des valeurs avec des virgules
    il m'affiche cette erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    syntax error: invalid arithmetic operator (error token is ".0")

  17. #17
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par BIG123 Voir le message
    Quand je mets des valeurs avec des virgules
    il m'affiche cette erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    syntax error: invalid arithmetic operator (error token is ".0")
    Normal, le shell ne sait traiter que les entiers.

    Comme exercice, je te laisse adapter le script pour qu'il utilise 'bc'

  18. #18
    Nouveau membre du Club
    Femme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 37
    Points : 27
    Points
    27
    Par défaut
    En fait le script ne marche pas quand il y a: au lieu des R1..........R5 des noms
    toto titi......tata

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     R-R.sh: line 4: tata=166: command not found
    R-R.sh: line 6: toto: value too great for base (error token is "toto")

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

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Points : 1 206
    Points
    1 206
    Par défaut
    @BIG123 pourrais-tu formuler ta demande de manière définitive et non incémentale. On aide bien volontier mais s'il faut changer nos solutions tous les deux posts on fatigue... Un vrai fichier représentatif aiderait également.

    Mon snippet adapté et aéré:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    $ cat a.awk 
     
    NR==FNR {
    	a[$1]=$2
    	next
    }
     
    {
    	d=a[$1]+a[$2]-$3
    	s=d<=0 \
    		? d==0 \
    			? "sont limite" \
    			: "ne se chevauchent pas et sont distants de avec une distance de: " d*-1 \
    		: "se chevauchent avec une distance de: " d
     
    	printf "%s et %s %s\n", $1, $2, s
    }
    @jack-ft eval == evil!
    Surtout avec l'option -e! Danger!
    :q :q! :wq :w :w! :wq! :quit :quit! :help help helpquit quit quithelp
    :quitplease :quitnow :leave :shit ^X^C ^C ^D ^Z ^Q QUITDAMMIT
    Jabber: ripat at im.apinc.org

  20. #20
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par BIG123 Voir le message
    En fait le script ne marche pas quand il y a: au lieu des R1..........R5 des noms
    toto titi......tata

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     R-R.sh: line 4: tata=166: command not found
    R-R.sh: line 6: toto: value too great for base (error token is "toto")
    J'avoue que je suis quelque peu surpris!
    Peux-tu poster (avec balises CODE) le contenu des 2 fichiers et du script?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 8
    Dernier message: 31/10/2007, 09h10
  2. Réponses: 2
    Dernier message: 19/04/2007, 13h54
  3. Réponses: 4
    Dernier message: 13/12/2006, 17h10
  4. [EXCEL] Taille des colonnes d'un fichier HTML importé
    Par Rei Angelus dans le forum Excel
    Réponses: 4
    Dernier message: 08/04/2006, 07h58
  5. [VB.NET] DataGrid : titre des colonnes sur deux lignes
    Par Lahouari dans le forum Windows Forms
    Réponses: 6
    Dernier message: 06/12/2004, 14h44

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