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 :

nombre de caractères dans un fichier


Sujet :

Linux

  1. #1
    Nouveau membre du Club
    Profil pro
    Ingénieur
    Inscrit en
    Mai 2004
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur

    Informations forums :
    Inscription : Mai 2004
    Messages : 69
    Points : 39
    Points
    39
    Par défaut nombre de caractères dans un fichier
    Bonjour,

    Je souhaite utiliser la commande awk sur un fichier csv et savoir si il n'y a pas un champ en moins ou en plus sur un enregistrement.
    Le séparateur est ";"
    Je souhaite connaitre le nombre de caractères ";" et diviser par le nombre de lignes.
    La méthode est-elle correcte.

    Merci pour vos infos.

  2. #2
    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
    Tu peux utiliser les 2 variables réservées de awk : NF et NR
    http://www.shellunix.com/awk.html


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    awk -F";" -v NbChampValide=35 '
    {
    	if (NF != NbChampValide) {
    		print "*** sur Record "NR" : "NF" champs presents (valide "NbChampValide") !!!" | "cat 1>&2"
    	}
    } '  test.txt

  3. #3
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    awk -F';' '{
      n[NF-1]++;
      max=NF-1>max?NF-1:max} 
    END{
      for (i=0;i<=max;i++)
        if (n[i])
          printf "%s lignes avec %d caractères ;\n",n[i],i
    }' x
    3 lignes avec 3 caractères ;
    1 lignes avec 4 caractères ;
    1 lignes avec 10 caractères ;

  4. #4
    Nouveau membre du Club
    Profil pro
    Ingénieur
    Inscrit en
    Mai 2004
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur

    Informations forums :
    Inscription : Mai 2004
    Messages : 69
    Points : 39
    Points
    39
    Par défaut
    Encore un grand merci pour vos solutions.

  5. #5
    Nouveau membre du Club
    Profil pro
    Ingénieur
    Inscrit en
    Mai 2004
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur

    Informations forums :
    Inscription : Mai 2004
    Messages : 69
    Points : 39
    Points
    39
    Par défaut
    Une autre question sur ce shell. Je souhaite ajouter un numéro de ligne dans le fichier test.txt

    fichier initial
    1;2;3;4;5;6;7;8;9
    1;2;3;4;5;6;7;8;9
    1;2;3;4;5;6;7;8;9

    fichier final
    00001;1;2;3;4;5;6;7;8;9
    00002;1;2;3;4;5;6;7;8;9
    00003;1;2;3;4;5;6;7;8;9

    shell controlant le nombre de champs par enregistrement.
    awk -F";" -v NbChampValide=9 '
    {
    if (NF != NbChampValide) {
    print "*** sur Record "NR" : "NF" champs presents (valide "NbChampValide") !!!" | "cat 1>&2"
    }
    } ' test.txt

    Ce shell ajoute le numéro de ligne mais pas le point virgule. Est-il possible de l'ajouter avec le shell suivant.

    awk
    {
    printf ("%05.05d%s\n",NR, $0)
    } ' test.txt

    Est-il possible de concaténer ces deux shells ?

    merci

  6. #6
    Nouveau membre du Club
    Profil pro
    Ingénieur
    Inscrit en
    Mai 2004
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur

    Informations forums :
    Inscription : Mai 2004
    Messages : 69
    Points : 39
    Points
    39
    Par défaut
    J'ai résolu mon problème d'ajout du séparateur.


    awk
    {
    printf ("%05.05d;%s\n",NR, $0)
    } ' test.txt>test2.txt

    awk -F";" -v NbChampValide=10 '
    {
    if (NF != NbChampValide) {
    print "*** sur Record "NR" : "NF" champs presents (valide "NbChampValide") !!!" | "cat 1>&2"
    }
    } ' test2.txt


    Et j'obtiens bien mon fichier final
    00001;1;2;3;4;5;6;7;8;9
    00002;1;2;3;4;5;6;7;8;9
    00003;1;2;3;4;5;6;7;8;9

    Est il possible de lancer 1 seule fois la commande awk car le temps de traitement sera diminué.

    Merci

  7. #7
    Nouveau membre du Club
    Profil pro
    Ingénieur
    Inscrit en
    Mai 2004
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur

    Informations forums :
    Inscription : Mai 2004
    Messages : 69
    Points : 39
    Points
    39
    Par défaut
    Est-il possible de réaliser ces deux awk (ou un awk) sur un ensemble de fichier dans un répertoire.
    Enfin, est-il possible de controler une partie du nom du fichier. Les 3 au 6e caractères du nom de chaque fichier sont égaux à la chaine "test", sinon erreur sur nom du fichier.

  8. #8
    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 le faire

    http://pwet.fr/man/linux/commandes/find

    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
     
    for file in $(find . -maxdepth 1 -type f) ; do
    	if [[ $(echo $file | grep -c "^./..test") -eq 0 ]] ; then 
    		echo "*** Nom fichier $file invalide"
    		continue
    	fi
    	echo "* Traitement $file"
    	awk -v NbChampValide=10 '
    	BEGIN {
    		FS=";"
    		OFS=";"
    	}
    	{
    		if (NF != NbChampValide) {
    			print "*** sur Record "NR" : "NF" champs presents (valide "NbChampValide") !!!" | "cat 1>&2"
    		}
    		printf("%06d;%s\n",NR,$0)
    	} '  $file
    done

  9. #9
    Nouveau membre du Club
    Profil pro
    Ingénieur
    Inscrit en
    Mai 2004
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur

    Informations forums :
    Inscription : Mai 2004
    Messages : 69
    Points : 39
    Points
    39
    Par défaut
    J'ai cette réponse.
    sh essai.sh
    invalid shell option nametglob
    essai.sh: line 2: syntax error near unexpected token `$'do\r''
    essai.sh: line 2: `for file in $(find . -maxdepth 1 -type f) ; do

    Est-il possible d'utiliser un awk avec substr au lieu du find

    for file in *
    do
    ???
    done

  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
    Citation Envoyé par rico3434 Voir le message
    J'ai cette réponse.
    sh essai.sh
    invalid shell option nametglob
    essai.sh: line 2: syntax error near unexpected token `$'do\r''
    essai.sh: line 2: `for file in $(find . -maxdepth 1 -type f) ; do
    \r me fait penser à un problème de script au format dos au lieu du format unix attendu.


    Tu peux remplacer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    for file in $(find . -maxdepth 1 -type f) ; do
    	if [[ $(echo $file | grep -c "^./..test") -eq 0 ]] ; then 
    		echo "*** Nom fichier $file invalide"
    		continue
    	fi
    	echo "* Traitement $file"
    par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    for file in * ; do
    	if [[ ! -f $file ]] ; then 
    		continue  #-- ceci n'est pas un fichier
    	fi
    	if [[ $(echo $file | grep -c "^..test") -eq 0 ]] ; then 
    		echo "*** Nom fichier $file invalide"
    		continue
    	fi
    	echo "* Traitement $file"

  11. #11
    Nouveau membre du Club
    Profil pro
    Ingénieur
    Inscrit en
    Mai 2004
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur

    Informations forums :
    Inscription : Mai 2004
    Messages : 69
    Points : 39
    Points
    39
    Par défaut
    merci pour ta réponse.

    En fait, j'ai testé le code sur cygwin, un émulateur unix sur windows.
    Sur une machine unix, pas de problème.
    As tu une idée pour le tester sur cygwin.

Discussions similaires

  1. Compter le nombre de caractères dans le titre d'un fichier
    Par jerem7286 dans le forum Shell et commandes GNU
    Réponses: 6
    Dernier message: 02/11/2013, 15h47
  2. Réponses: 15
    Dernier message: 26/04/2009, 17h08
  3. Réponses: 10
    Dernier message: 09/02/2008, 12h40
  4. [Fichier] Nombre de ligne dans un fichier texte
    Par NewSer dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 10/11/2004, 17h58
  5. Réponses: 2
    Dernier message: 02/03/2004, 20h38

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