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 :

variable NR de AWK


Sujet :

Linux

  1. #1
    Membre éclairé
    Inscrit en
    Décembre 2006
    Messages
    243
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 243
    Par défaut variable NR de AWK
    Bonjour,

    J'essai de passer une variable au paramêtre NR de la commande AWK, mais je n'obtiens aucun résultat.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    i=2
    while [ "$i" -le "$NB_LIG"  ]
    do
    awk -F" " '(NR==$i) {print $1,$2,$3,$4,$5,$6,"NULL","NULL"}' test_g > fic_${liste[$i-1]}
    let i=i+1
    done
    Merci pour votre aide.

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    271
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 271
    Par défaut
    NR est une variable spéciale en awk donc à proscrire.

    De plus pour passer une variable du shell à awk il faut utiliser l'option "-v".

    Par contre si tu veux récupérer en awk certaines lignes d'un fichier, il ya + simple que la combinaison d'une boucle en shell et du awk. Tu peux le faire en awk uniquement.

    Peux tu nous donner + de détails sur l'objectif du script ?

  3. #3
    Membre éclairé
    Inscrit en
    Décembre 2006
    Messages
    243
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 243
    Par défaut
    Merci,

    En fait, j'ai un fichier "test_g" qui a X lignes. Je ne prends pas en compte la première ligne.
    Ensuite je veux distribuer ligne par ligne le contenu (certains champs avec awk) du fichier dans d'autres fichiers.
    pour obtenir une ligne par fichiers créés

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    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 840
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par jonathan1 Voir le message
    Merci,

    En fait, j'ai un fichier "test_g" qui a X lignes. Je ne prends pas en compte la première ligne.
    Soit tu t'arranges, via tail, pour créer une copie de ton fichier sans la première ligne et tu passes ce résultat à awk via pipe, soit tu programmes awk pour qu'il ne traite pas la première ligne avec un if (NR == 1) next

    Citation Envoyé par jonathan1 Voir le message
    Ensuite je veux distribuer ligne par ligne le contenu (certains champs avec awk) du fichier dans d'autres fichiers pour obtenir une ligne par fichiers créés
    Soit ton awk affiche le tout et tu le parses par un algo shell qui va dispatcher le tout sur les fichiers qui vont bien, soit ton awk s'occupera lui-même l'écriture des autres fichiers
    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]

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    271
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 271
    Par défaut
    Un exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    awk '{if(NR != 1){print $1" "$2 > NR".list.txt" }  }'
    Ne pas prendre la première ligne du fichier.
    Puis pour chaque ligne du fichier, écrire la colonne 1 et la colonne 2 dans un fichier qui porte le nom : NR.list.txt avec NR est le numéro de ligne en cours.

  6. #6
    Membre éclairé
    Inscrit en
    Décembre 2006
    Messages
    243
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 243
    Par défaut
    Merci pour vos réponses

    Ca m'a permis d'aller voir ailleurs. Voila ce que j'ai fait, ça me parait plus simple qu'un programme awk.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    i=1
    IFS=""
    while read LIGNE
    do
    	if [ "$i" -eq "1" ]
    	then
    	else
    	echo $LIGNE > fic
    	awk -F" " '{print $1,$2,$3,$4,$5,$6,"NULL","NULL"}' fic > fic_${liste[$i-1]}
    	rm fic
    	fi
    let i=i+1
    done < test_g

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    271
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 271
    Par défaut
    Oui c'est + simple à première vue mais le temps de traitement sera beaucoup + long qu'un simple awk .

    Tu peux remplacer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if [ "$i" -eq "1" ]
    then
    else
      CODE
    fi
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if [ $i -gt 1 ]
    then
      CODE
    fi

    Remarque : les comparaisons gt/ge/ne/eq/le/lt sont des comparaisons numériques donc ne pas mettre des " autour des variables.

  8. #8
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    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 840
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par jonathan1 Voir le message
    Merci pour vos réponses

    Ca m'a permis d'aller voir ailleurs. Voila ce que j'ai fait, ça me parait plus simple qu'un programme awk.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    i=1
    IFS=""
    while read LIGNE
    do
    	if [ "$i" -eq "1" ]
    	then
    	else
    	echo $LIGNE > fic
    	awk -F" " '{print $1,$2,$3,$4,$5,$6,"NULL","NULL"}' fic > fic_${liste[$i-1]}
    	rm fic
    	fi
    let i=i+1
    done < test_g
    Bon, ça marchera mais Tamiel l'a dit, ce sera plus long. Je ne vois d'ailleurs pas trop pourquoi tu touches à l'IFS mais déjà tu peux remplacer tes deux lignes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    echo truc >fic
    awk '{...}' fic > fic2
    Par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo "truc" |awk '{...}' >fic2
    Sinon si tu veux un programme à la fois souple comme le shell et rapide comme le C, tu peux t'essayer à Python. Moi j'ai essayé et je ne le lache plus...
    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
    18
    19
    20
    21
    22
    23
    #!/usr/bin/env python
    # coding: Latin-1 -*
     
    i=1
    file_in=open("test_g", "r")
    while True:
        ligne=file_in.readline()
        if i == 1: continue
     
        # Découpage de la ligne
        tabMots=ligne.split("<le caractère qui sépare les mots de ta ligne>")
     
        # Création ligne à écrire
        ligne=""
        for mot in tabMots:
            ligne+=" %s" % mot
     
        # Ouverture, écriture ligne et fermeture
        file_out=open("fic_%d" % (i - 1), "w")
        file_out.writeline(ligne + "\n")
        file_out.close()
     
        i=i+1
    A peine plus long à écrire que ton script...
    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]

  9. #9
    Membre éclairé
    Inscrit en
    Décembre 2006
    Messages
    243
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 243
    Par défaut
    Merci pour ta contribution Sve@r.
    J'aimerai aussi essayer python mais je n'ai pas le choix.

    (le IFS"" permet à
    de ne pas s'arrêter au premier espace.

  10. #10
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    271
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 271
    Par défaut
    L'IFS ( Internal Field Separator ) sert plutôt au moment de l'utilisation de read

  11. #11
    Membre éclairé
    Inscrit en
    Décembre 2006
    Messages
    243
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 243
    Par défaut
    oui,

    mais au final dans "truc" y a pas tout.

    pendant que j'y suis (désolé, j'ai pas encore cherché)

    je veux faire une somme de nombre à virgule genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $SOMME=$SOMME+$LIGNE | bc
    j'ai essayé différentes syntaxe mais ca marche pas

  12. #12
    Membre éclairé
    Inscrit en
    Décembre 2006
    Messages
    243
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 243
    Par défaut
    C'est bon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SOMME=$(echo "$SOMME+$LIGNE" | bc)

  13. #13
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    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 840
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par jonathan1 Voir le message
    (le IFS"" permet à
    de ne pas s'arrêter au premier espace.
    Sans toucher à l'IFS (c'est hyper dangereux)
    Citation Envoyé par tamiel Voir le message
    L'IFS ( Internal Field Separator ) sert plutôt au moment de l'utilisation de read
    Non. Le read se cale sur le "return" et pas sur l'IFS.
    L'IFS est utilisé pour "set" et pour "for"
    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]

  14. #14
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    271
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 271
    Par défaut
    Oui c'est bien sur le return ( comme quoi il vaut mieux se taire des fois )

  15. #15
    Membre éclairé
    Inscrit en
    Décembre 2006
    Messages
    243
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 243
    Par défaut
    Merci

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

Discussions similaires

  1. [Variables] Concaténation commande AWK
    Par amazigh42 dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 27/04/2015, 11h06
  2. Remplacer un motif avec le contenu d'une variable via sed / awk
    Par deupac dans le forum Shell et commandes GNU
    Réponses: 12
    Dernier message: 18/03/2010, 20h30
  3. problème de variables avec script awk
    Par zcoul dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 19/02/2008, 14h16
  4. Réponses: 1
    Dernier message: 14/10/2007, 12h44
  5. récuperer dans une variable ce que AWK affiche
    Par Marcolinho dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 13/06/2007, 11h36

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