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 :

awk commande problème


Sujet :

Shell et commandes GNU

  1. #1
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Par défaut awk commande problème
    Bonjour,

    j’espère que je suis dans le bon forum..j'ai un problème avec une requête qui doit compter le nombre de (|) dans un fichier pour chaque ligne..
    et s'il en manque, compeleter jusqu'à 47.

    voilà la commande:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cat source_file |  awk -F"|" 'NF < 47 {var=""; for (i=0;i<(47-NF);i++) var=var"|";echo $0var;  print $0var;} NF == 47 {print $0;}' >  dest_file
    mais pour un fichier ça me supprime tout, le fichier résultat est vide..

    je ne sais pas comment débugger ..pour bien voir où est le problème ..

    Merci

  2. #2
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Par défaut
    Bonsoir.

    Quelque chose dans ce style conviendrait ?

    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
    #!/bin/bash
     
    source_file=fichier.txt
    tmp=fichier2.txt
     
    cat $source_file | while read ligne
    do
    	nb=$(echo $ligne | awk 'BEGIN{FS="|"} {print NF}')
     
    	ligne2=$ligne
     
    	if [ $nb -lt 47 ]
    	then
    		for (( i=nb ; i<47 ; i=$i+1 ))
    		do
    			ligne2="$ligne2|"
    		done
    	fi 
     
    	echo $ligne2 >> $tmp
    done
    rm $source_file
    mv $tmp $source_file
    N.B : il y a surement plus simple

    Cordialement,
    Idriss

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

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

    Code script.awk : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #!/usr/bin/awk -f
     
    BEGIN{FS="|"}
    {
       if( NF < 47 ){
          for (i=0; i<(47 - NF); i++) var=var"|"
       }
       print $0""var
       var=""
    }
    puis, après un chmod adéquat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ./script.awk Source > Destination
    mv Destination Source

  4. #4
    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 : 49
    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
    utiliser cat .... | awk .....
    c'est pas nécessaire pour ce genre de manipulation

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk .......... fichiersAtraiter > fichierResultant

  5. #5
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Par défaut
    Bonjour,

    J'ai essayé le script de N_bah,
    je n'arrive pas à l’exécuter erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ./script.awk: Not a directory

  6. #6
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Par défaut
    Pouvez-vous nous retourner le résultat de la commande ci-dessous, dans le répertoire ou vous avez essayé d’exécuter le script ?

    Cordialement,
    Idriss

  7. #7
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Par défaut
    vide ..

  8. #8
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Par défaut
    Tu n'es surement pas dans le bon répertoire alors.
    Il faut faire ./mon_script quand on est dans le répertoire ou se situe le script.

    Cordialement,
    Idriss

  9. #9
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    >ls *.sh
     
    script.sh
     
     
    >./script.sh
     
    ./script.sh: Not a directory

  10. #10
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Par défaut
    Et ls -l pour voir les droits ?

    S'il n'y a pas les droits d'exécution, il faut faire un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    chmod +x script.sh # ou script.awk pour celui de N_Bah

  11. #11
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Par défaut
    -rwxrwxrwx .


    peu être j'ai une ancienne version de awk, le readLine fonctionnait pas.

  12. #12
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Par défaut
    re..bonjour,

    Au fait, je reformule ma question autrement,
    je voudrais supprimer du fichier résultat toutes les colonnes et séparateurs si ça dépasse 47, ma première commande complète le fichier s'il le nombre de colonnes est inférieur à 47.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 716
    Par défaut
    on continue :
    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
    #!/usr/bin/awk -f
    
    BEGIN{ FS="|" }
    {
       if( NF < 47 ){
          for (i=0; i<(47 - NF); i++) var=var"|"
          print $0""var
          var=""
       } else
       if(NF>47){
          for(x=1; x<=47; x++){
             if(! var) {var = $x} else {var = var"|"$x }
          }
          print var
          var=""
       } else { print $0 }
    }
    ~

  14. #14
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Par défaut
    Pourquoi le test

    ça me donne l'erreur: Event not found

    Je le f ais directement en ligne de commande sans passer par un script:

    le fichier source contient 35 lignes..avec un NF 48.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cat source | awk -F"|" 'NF>47 { var=$0; for (i=1;i<=47;i++)  var=var"|"$i ; print var; var=""; }' > tmp
    le fichier tmp a un NF = 95..

  15. #15
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Par défaut
    si j'ai bien compris..

    $0 ça affiche toute la ligne. .

    donc je commence par $1..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cat source | awk -F"|" 'NF<47 {var="";  for (i=0;i<47-NF;i++) var=var"|"; print $0var;} NF>47   { var=$1; for (i=2;i<=47;i++)  var=var"|"$i ; print var; } NF == 47 {print $0;}' > dest

    ça l'air de fonctionner ..


    Je teste encore toutes les possibilités.

    Merci

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

Discussions similaires

  1. [AC-2007] Bouton de commande : problème clique
    Par nancy54 dans le forum Runtime
    Réponses: 1
    Dernier message: 12/07/2010, 16h43
  2. Programme Client/Commande problème de contraintes
    Par skulled dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 01/04/2010, 14h20
  3. Awk : commande system
    Par bobby.dick dans le forum AIX
    Réponses: 3
    Dernier message: 30/01/2010, 09h19
  4. [awk][Solaris] Problème entre les différentes versions de awk
    Par novices dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 02/07/2008, 10h47
  5. AWK, commande systeme et variable
    Par blacknight74 dans le forum Linux
    Réponses: 14
    Dernier message: 15/09/2007, 15h52

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