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. #21
    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
    fichier1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    1bcfA 1b9bA 728.0
    1nat_ 1b9bA 703.0
    1nat_ 1bcfA 431.0
    1rn1C 1b9bA 858.0
    1rn1C 1bcfA 498.0
    1rn1C 1nat_ 405.0
    2plt_ 1b9bA 901.0
    2plt_ 1bcfA 561.0
    2plt_ 1nat_ 432.0
    2plt_ 1rn1C 379.0
    fichier2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    1nat_ 166.0
    2plt_ 101.0
    1b9bA 211.0
    1bcfA 251.0
    1rn1C 19.0
    script
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #!/bin/ksh
    fichierDist=/udd/me/test/fichierDist.txt;
    fichierRayo=/udd/me/test/fichierRay.txt;
    eval $(sed -e 's/  */=/' $fichierRayo)
    while read Ri Rj Dk ; do
        d=$(($Ri + $Rj - Dk))
        if [[ $d -gt 0 ]]
        then echo "$Ri et $Rj se chevauchent avec une distance de: $d" 
        elif [[ $d -lt 0 ]]
        then echo "$Ri  et $Rj ne se chevauchent et ils sont distants de: $((-d))" 
        else echo "$Ri  et $Rj sont limites " 
        fi
    done < $fichierDist
    et même si j'ai changé mes deux fichiers en mettant des valeurs exactes (pas des .0)
    il y a toujours l'erreur

  2. #22
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    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 102
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par ripat Voir le message
    @jack-ft eval == evil!
    C'est pas faux...

    Un petit malin pourrait effacer tout le disque...

    Surtout avec l'option -e! Danger!
    Tu parles de 'set -o errexit' ? Je ne vois pas le rapport

    Sinon, avec un bon interprète (ksh, bash ou perl), on peut aussi utiliser des tableaux associatifs... pour associer une valeur à... un identifiant, non?
    N'est-ce pas d'ailleurs ce que fait ton instruction a[$1]=$2 ?

    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
    #!/bin/ksh
     
    while read Ri ri ; do
        diam[$Ri]=$ri
    done < fichier1
     
    while read Ri Rj Dk ; do
        d=$((${diam[$Ri]} + ${diam[$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

  3. #23
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    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 102
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par BIG123 Voir le message
    fichier1
    Oops! Mon code fait l'assomption que la 1ère colonne contient ce qui peut être vu par le shell comme un identifiant, c'est-à-dire une lettre suivie de chiffres ou lettres ou _
    Comme des éléments commencent par un chiffre, ça ne peut pas marcher!
    Essaie avec le code sans eval que je viens de poster... mais qui ne marche que pour des entiers...

    PS: je crois que le code de ripat fonctionne avec des flottants...

  4. #24
    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
    Citation Envoyé par jack-ft Voir le message
    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
    #!/bin/ksh
     
    while read Ri ri ; do
        diam[$Ri]=$ri
    done < fichier1
     
    while read Ri Rj Dk ; do
        d=$((${diam[$Ri]} + ${diam[$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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    test/R-R.sh: line 5: 1nat_: value too great for base (error token is "1nat_")
    test/R-R.sh: line 8: 1bcfA: value too great for base (error token is "1bcfA")

  5. #25
    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
    Citation Envoyé par ripat Voir le message
    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
    }
    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
    fichierDist=/udd/me/test/fichierDist.txt;
    fichierRayo=/udd/me/test/fichierRay.txt;
    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: " d*-1 \
    		: "se chevauchent avec une distance de: " d
     
    	echo "%s et %s %s\n", $1, $2, s
    }
    awk -f a.awk $fichierDist $fichierRayo
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    awk: fatal: can't open source file `a.awk' for reading (No such file or directory)
    test/R-R.sh: line 5: {: command not found
    test/R-R.sh: line 7: next: command not found
    test/R-R.sh: line 8: syntax error near unexpected token `}'
    test/R-R.sh: line 8: `} '

  6. #26
    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
    Non, tu dois mettre le code awk dans un fichier séparé comme dans mon post plus haut. Par exemple a.awk

    Il ne doit pas nécessairement être exécutable. Ensuite tu invoaque l'interpréteur awk comme ceci:

    Attention à l'ordre de f1 et f2!

    si tu veux l'intégrer dans un script bash plus large, tu peux faire:

    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
    fichierDist=/udd/me/test/fichierDist.txt;
    fichierRayo=/udd/me/test/fichierRay.txt;
    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: " (-1*d) \
    		: "se chevauchent avec une distance de: " d
    	print $1, $2, s
    }' $fichierRayo $fichierDist
    Citation Envoyé par jack-ft Voir le message
    Tu parles de 'set -o errexit' ? Je ne vois pas le rapport
    Je voulais dire l'option -e de sed.

  7. #27
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    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 102
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par BIG123 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -f a.awk $fichierDist $fichierRayo
    [code]awk: fatal: can't open source file `a.awk' for reading (No such file or directory)
    Il faut mettre tout le code awk dans un fichier a.awk pour pouvoir lancer awk avec l'option -f

  8. #28
    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
    ça marche
    Merci bien pour votre aide

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

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