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 :

[Debutant]Effacer des lignes dans un fichier


Sujet :

Linux

  1. #1
    Membre régulier
    Inscrit en
    Janvier 2007
    Messages
    265
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 265
    Points : 98
    Points
    98
    Par défaut [Debutant]Effacer des lignes dans un fichier
    Bonjour je suis debutant dans shell
    Je desirerai effacer les lignes 4 et 5 dans ce fichier.csv qui se presente ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    aaaa1;bbbb1;cccc1;dddd1
    aaaa2;bbbb2;cccc2;dddd2
    aaaa3;bbbb3;cccc3;dddd3
         ;bbbb4;cccc4;dddd4
    aaaa5;bbbb5;;dddd5
    aaaa6;bbbb6;cccc6;dddd6
    aaaa7;bbbb7;cccc7;dddd7
    .
    .
    .
    J'ai essaye de le faire avec du AWK, si possible y aurait il moyen de le faire avec AWK.
    En vous remerciant a l'avance.

    cordialement

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    417
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2007
    Messages : 417
    Points : 376
    Points
    376
    Par défaut
    essaie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sed '4d' fichier
    sed '5d' fichier
    avec fichier le nom de ton fichier evidemment

  3. #3
    Membre régulier
    Inscrit en
    Janvier 2007
    Messages
    265
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 265
    Points : 98
    Points
    98
    Par défaut
    Bonjour et un grand merci pour ta reponse.
    Je pensais qu'on pouvait le faire avec AWK, uniquement, mais je vais tester ca.
    Cordialement.

  4. #4
    Membre régulier
    Inscrit en
    Janvier 2007
    Messages
    265
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 265
    Points : 98
    Points
    98
    Par défaut
    Petite question peut on utiliser

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    sed '4d' fichier
    sed '5d' fichier
    dans AWK ???

  5. #5
    Membre éclairé Avatar de BlaireauOne
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    492
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2007
    Messages : 492
    Points : 652
    Points
    652
    Par défaut
    Quelque chose me dit que tu veux absolument utiliser awk
    http://www.shellunix.com/awk.html

    Dans ce cas :

    Version compacte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk '{if (NR<4 || NR>5) print $0}' test.txt

    Version "aérée" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    awk '
    {
        #-- NR signifie Number Record
        if (NR < 4 || NR > 5) 
            print $0 
    }' test.txt

  6. #6
    Membre régulier
    Inscrit en
    Janvier 2007
    Messages
    265
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 265
    Points : 98
    Points
    98
    Par défaut
    Je te remercie pour ton intervention BlaireauOne
    J'ai essaye d'exploiter ce que tu as poste mais malheureusement ca n'a pas marche, parce que NR c'est l'indice de l'enregistrement courrant, et si je met un nombre celui ci va m'afficher la ligne correspondant a NR.
    Peut etre voulais tu parler de NF qui est "Number of field" nombre de champs, j'ai essaye d'attribuer une valeur mais ca n'a pas marche.
    Je ne trouve pas de solution concrete dans pour awk.
    Dans la plupart des langage pour afficher on fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Si condition
    Affichage
    Fin si
    Avec awk je n'ai pas trouve la solution, elle existe sans doute mais l'etat de mes connaissances actuel, ne me permet pas pour l'instant de faire ce que je veux, d'ou mon posting.

    Bien cordialement

  7. #7
    Membre éclairé Avatar de BlaireauOne
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    492
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2007
    Messages : 492
    Points : 652
    Points
    652
    Par défaut
    Citation Envoyé par smutmutant2003 Voir le message
    Bonjour je suis debutant dans shell
    Je desirerai effacer les lignes 4 et 5 dans ce fichier.csv qui se presente ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    aaaa1;bbbb1;cccc1;dddd1
    aaaa2;bbbb2;cccc2;dddd2
    aaaa3;bbbb3;cccc3;dddd3
         ;bbbb4;cccc4;dddd4
    aaaa5;bbbb5;;dddd5
    aaaa6;bbbb6;cccc6;dddd6
    aaaa7;bbbb7;cccc7;dddd7

    Il doit y avoir un malentendu.
    Si tu exécute la procédure awk telle quelle sur le fichier ci-dessus, le résultat est le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    aaaa1;bbbb1;cccc1;dddd1
    aaaa2;bbbb2;cccc2;dddd2
    aaaa3;bbbb3;cccc3;dddd3
    aaaa6;bbbb6;cccc6;dddd6
    aaaa7;bbbb7;cccc7;dddd7
    Les enregistrements 4 et 5 sont bien éliminés

  8. #8
    Membre averti
    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
    Points : 329
    Points
    329
    Par défaut
    Je pense que ton objectif est d'éliminer les lignes erronées sans connaitre le numéro de ligne.

    Avec grep c'est simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    grep -E '^((([Aa-Zz]|[0-9])+;){3}([Aa-Zz]|[0-9])+)$' test.txt
    Pour awk (pas gawk qui prendrait la regexp de grep) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    awk '{if ($0 ~ /^([A-Za-z0-9])+;([A-Za-z0-9])+;([A-Za-z0-9])+;([A-Za-z0-9])+$/) print $0}' test.txt

  9. #9
    Membre régulier
    Inscrit en
    Janvier 2007
    Messages
    265
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 265
    Points : 98
    Points
    98
    Par défaut
    Je te remercie tamiel
    C'est exactement ça, j'ai oublie de le preciser, effectivement je ne connais pas toujours le numero de ligne dans la mesure ou ce fichier csv provient d'une base de donnees et certains champs de d'enregistrement ne sont pas forcement renseignes.
    C'est peut etre pour ca que le code que m'a donne "BlaireauOne" -desole d'ecorcher ton pseudo l'ami - n'a pas marche parce que chez moi le fichier est beaucoup, beaucoup plus long, il y a 550.000 enregistrements, et les numeros de lignes ne correspondent pas a la ligne 4 et 5.

    Toutefois j'ai execute avec grand interet le bout de code que m'a donne Tarmiel, et il n'a pas marche, parce qu'il affiche toute les lignes, sans exclure les lignes que je ne veux pas.

    Bien cordialement

  10. #10
    Membre éclairé Avatar de BlaireauOne
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    492
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2007
    Messages : 492
    Points : 652
    Points
    652
    Par défaut
    Ça doit faire ce que tu veux
    http://www.shellunix.com/regexp.html
    http://www.shellunix.com/awk.html


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    awk -F";" '
    {
        #-- si les champs 1 et/ou 3 sont à blanc ou vides
        if (length($1)==0 || $1 ~ /^ +$/ || length($3)==0 || $3 ~ /^ +$/) {
    	print "** ENR "NR", champ 1 et/ou 3 vide(s) : "$0 | "cat 1>&2"
    	next
        }
        print $0 
    }
    ' liste.txt > resultat.txt
     
    echo "+ resultat.txt"
    cat resultat.txt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    ** ENR 4, champ 1 et/ou 3 vide(s) :      ;bbbb4;cccc4;dddd4
    ** ENR 5, champ 1 et/ou 3 vide(s) : aaaa5;bbbb5;;dddd5
    + resultat.txt
    aaaa1;bbbb1;cccc1;dddd1
    aaaa2;bbbb2;cccc2;dddd2
    aaaa3;bbbb3;cccc3;dddd3
    aaaa6;bbbb6;cccc6;dddd6
    aaaa7;bbbb7;cccc7;dddd7

  11. #11
    Membre régulier
    Inscrit en
    Janvier 2007
    Messages
    265
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 265
    Points : 98
    Points
    98
    Par défaut
    Je te remercie BlaireauOne je n'ai pas eu le temps de tester le code, moi je dois avoir pres de 11 champs, et pour chacun d'entre eux un controle sur la longueur du champs et l'existence du champs.
    Je pense que ton bout de code devrait me convenir, je vais la tester dans la semaine et je te dis quoi.

    Bien cordialement.

  12. #12
    Membre éclairé Avatar de BlaireauOne
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    492
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2007
    Messages : 492
    Points : 652
    Points
    652
    Par défaut
    Citation Envoyé par smutmutant2003 Voir le message
    .../...
    je dois avoir pres de 11 champs, et pour chacun d'entre eux un controle sur la longueur du champs et l'existence du champs.
    Pour éviter de faire 11 tests, ceci doit faire l'affaire


    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
     
    awk -F";" '
    {
        #-- Detection des champs à blanc ou vides
        ano=0
        for (field=1 ; field <= NF ; field++) {
    		if (length($field)==0 || $field ~ /^ +$/)
    		{
    			ano++
    			if (ano == 1) {
    				printf("*** ENR %6d : champ(s) vide(s) --> %2d",NR,field) | "cat 1>&2"
    			} else {
    				printf(", %2d ",field) | "cat 1>&2"
    			}
    		}
    	}
    	if (ano > 0) {
    		print "" | "cat 1>&2"
    		next
    	}
        print $0 
    }
    ' liste.txt > resultat.txt

    liste.txt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    aaaa1;bbbb1;cccc1;dddd1
    aaaa2;bbbb2;cccc2;dddd2
    aaaa3;bbbb3;cccc3;dddd3
         ;bbbb4;cccc4;dddd4
    aaaa5;bbbb5;;dddd5
    aaaa6;bbbb6;cccc6;dddd6
    aaaa7;bbbb7;cccc7;dddd7
    aaaa8;; ;dddd8
    ;;;
    Traitement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    *** ENR      4 : champ(s) vide(s) -->  1
    *** ENR      5 : champ(s) vide(s) -->  3
    *** ENR      8 : champ(s) vide(s) -->  2,  3 
    *** ENR      9 : champ(s) vide(s) -->  1,  2 ,  3 ,  4

  13. #13
    Membre régulier
    Inscrit en
    Janvier 2007
    Messages
    265
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 265
    Points : 98
    Points
    98
    Par défaut
    En fait ce que je voudrais c'est de passer
    de ce stade
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    aaaa1;bbbb1;cccc1;dddd1
    aaaa2;bbbb2;cccc2;dddd2
    aaaa3;bbbb3;cccc3;dddd3
         ;bbbb4;cccc4;dddd4
    aaaa5;bbbb5;;dddd5
    aaaa6;bbbb6;cccc6;dddd6
    aaaa7;bbbb7;cccc7;dddd7
    a celui ci pour l'affichage pour les 11 champs

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    aaaa1;bbbb1;cccc1;dddd1
    aaaa2;bbbb2;cccc2;dddd2
    aaaa3;bbbb3;cccc3;dddd3
    aaaa6;bbbb6;cccc6;dddd6
    aaaa7;bbbb7;cccc7;dddd7
    Les lignes qui ne correspondent pas au cahier des charges sont supprimes de l'affichage. Comment supprime-t-on une ligne en awk ???
    Ca pour un debutant comme moi qui passe de shell au perl sans connaitre les deux langages ca me depasse, mais maintenant avec vos tutoriaux, et votre aide precieuse ca commence a aller mieux.
    En vous remerciant a l'avance

  14. #14
    Membre éclairé Avatar de BlaireauOne
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    492
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2007
    Messages : 492
    Points : 652
    Points
    652
    Par défaut
    Les lignes qui ne correspondent pas au cahier des charges sont supprimes de l'affichage. Comment supprime-t-on une ligne en awk ???

    Si tu exécutes le script awk cité dans mon précédent courriel, tu constateras que le fichier résultat.txt contient bien ce que tu attends

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    aaaa1;bbbb1;cccc1;dddd1
    aaaa2;bbbb2;cccc2;dddd2
    aaaa3;bbbb3;cccc3;dddd3
    aaaa6;bbbb6;cccc6;dddd6
    aaaa7;bbbb7;cccc7;dddd7

Discussions similaires

  1. Effacer des lignes dans un fichier ?
    Par Instanton dans le forum Général Python
    Réponses: 5
    Dernier message: 31/12/2007, 13h22
  2. [FSO] Effacer une ligne dans un fichier
    Par Johnbob dans le forum ASP
    Réponses: 4
    Dernier message: 30/05/2007, 16h23
  3. [langage] Effacer une ligne dans un fichier
    Par sebi77 dans le forum Langage
    Réponses: 2
    Dernier message: 01/01/2005, 12h43
  4. [debutant] preservation des espace dans un fichier xml
    Par Eric B dans le forum XML/XSL et SOAP
    Réponses: 7
    Dernier message: 03/09/2003, 09h43

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