Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications > Shell
Shell Vos questions sur l'utilisation des commandes shell
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 22/03/2011, 12h24   #1
Membre Expert
 
Avatar de Bktero
 
Inscription : juin 2009
Messages : 770
Détails du profil
Informations personnelles :
Âge : 24
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Secteur : Industrie

Informations forums :
Inscription : juin 2009
Messages : 770
Points : 1 290
Points : 1 290
Par défaut Compter le nombre d'occurence d'un caractère donné, par ligne du fichier

Bonjour,

J'ai un fichier contenant plusieurs (séparées par un retour chariot donc). Chaque ligne est constituée de plusieurs champs, le séparateur de champ étant | (barre verticale). Certains champs peuvent être vides.

Mon objectif : compter le nombre de champs, y compris les champs vides.

J'ai d'abord essayé avec une commande AWK (inspirée ce qu'il y a ici) :

Citation:
cat conversion.txt | awk -F "|" '{ print "Ligne n" NR " il y a " NF " champs" ; } '
Le problème est que les champs vides ne sont pas comptés...

Je me suis donc mis en tête de compter le nombre de caractères | par ligne, mais ce n'est pas très fructueux... Je pense en être pas loin avec ça :

Citation:
cat conversion.txt.bak | xargs -I varligne echo varligne | grep -o "|" | wc -l
mais le wc -l se fait sur tout et non pour la ligne en cours. J'obtiens donc un magnifique 417, le nombre total de | du fichier


Si quelqu'un a une idée pour m'aiguiller, je serai très content !

Merci d'avance !
__________________
Pour les adeptes du langage SMS, allez ici et ramenez la traduction française ^^

Pour vos problèmes d'embarqué, utilisez le forum dédié !
Bktero est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 22/03/2011, 12h34   #2
Membre éclairé
 
Avatar de FRUiT
 
Homme
Inscription : février 2011
Messages : 83
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 36
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : février 2011
Messages : 83
Points : 326
Points : 326
Code :
awk '{ x=0; x+=gsub("\\|",""); print x }' conversion.txt
__________________
Neon Suite by FRUiT (kde4.6) http://tinyurl.com/yzm7cee
"Pour la carotte, le lapin est la plus parfaite incarnation du mal" (R. Sheckley)
clean
FRUiT est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 22/03/2011, 12h54   #3
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
Salut,
Citation:
Envoyé par Bktero Voir le message
Mon objectif : compter le nombre de champs, y compris les champs vides.

J'ai d'abord essayé avec une commande AWK (inspirée ce qu'il y a ici) :

Le problème est que les champs vides ne sont pas comptés...
Tu es sûr ?

Code :
1
2
3
4
5
6
7
8
9
$ cat plop
a|b||d|e||g
1|2|3|4|5|6|7

$ awk -F'|' '{ print "ligne " NR " a " NF " champs" }' plop
ligne 1 a 7 champs
ligne 2 a 7 champs

$
Tu as dû louper un truc, non ?
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 22/03/2011, 14h45   #4
Membre Expert
 
Avatar de Bktero
 
Inscription : juin 2009
Messages : 770
Détails du profil
Informations personnelles :
Âge : 24
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Secteur : Industrie

Informations forums :
Inscription : juin 2009
Messages : 770
Points : 1 290
Points : 1 290
Bonjour,

Vos deux solutions donnent le même résultat. C'est déjà bien

Oui, quelque chose doit m'échapper. Je compte à la main, je ne trouve pas le même nombre que la commande. Je ne pense pourtant pas être fou ou aveugle. Voici l'un des lignes du fichier par exemple :

Citation:
Export_D4|Forfait|Gestion des Paiements|Fermé|$DATEDUJOUR|$DATEDUJOUR|_ERCAUTO|_ERCAUTO|$DATEDUJOUR|FACTURE|Recouvrement|Pénalité retard de paiement|Facturée|Spain Telecom|Clos|Fermé|5 euros TTC|||$DATEDUJOUR||$DATEDUJOUR|Traitement SpTel|_ERCAUTO|_ERCAUTO|$DATEDUJOUR
Visuellement, je compte 26 champs et (très logiquement) 25 barres. En revanche, je compte effectivement 23 champs non vides.

Vos lignes me donnent :
Citation:
ligne 1 a 23 champs
Quelque chose m'échappe....
__________________
Pour les adeptes du langage SMS, allez ici et ramenez la traduction française ^^

Pour vos problèmes d'embarqué, utilisez le forum dédié !
Bktero est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 22/03/2011, 14h50   #5
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
Pour la solution de FRUIT, il faut initialiser la variable x à 1 et non pas à 0

Code :
awk '{ x=1; x+=gsub("\\|",""); print x }'
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 22/03/2011, 15h27   #6
Membre Expert
 
Avatar de Bktero
 
Inscription : juin 2009
Messages : 770
Détails du profil
Informations personnelles :
Âge : 24
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Secteur : Industrie

Informations forums :
Inscription : juin 2009
Messages : 770
Points : 1 290
Points : 1 290
Euh....Quand je dis que quelque chose m'échappe, c'est par rapport à la différence entre mon compte visuel et le compte des lignes de commandes ; mais pas entre la différence entre vos deux lignes ! Tu comptes les champs, et FRUIT les séparateurs de champs, j'avais tilté

Non, mais je voudrais savoir pourquoi je compte 25/26 et que vos lignes trouvent 22/23
__________________
Pour les adeptes du langage SMS, allez ici et ramenez la traduction française ^^

Pour vos problèmes d'embarqué, utilisez le forum dédié !
Bktero est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 22/03/2011, 15h29   #7
Expert Confirmé Sénior
 
Avatar de frp31
 
Homme francois
Ingénieur systèmes et réseaux
Inscription : juillet 2006
Messages : 3 534
Détails du profil
Informations personnelles :
Nom : Homme francois
Âge : 35
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 : 3 534
Points : 7 743
Points : 7 743
le classique oubli, sur le comptage numéraire qui commence à 1 au lieu de zéro...
me serai fait avoir aussi moi ...
frp31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/03/2011, 15h30   #8
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
Change de lunettes

Code :
1
2
3
4
5
6
7
8
$ echo $VAR
Export_D4|Forfait|Gestion des Paiements|Fermé|||_ERCAUTO|_ERCAUTO||FACTURE|Recouvrement|Pénalité retard de paiement|Facturée|Spain Telecom|Clos|Fermé|5 euros TTC||||||Traitement SpTel|_ERCAUTO|_ERCAUTO|

$ awk '{ x=1; x+=gsub("\\|",""); print x }' <<<$VAR
26

$ awk -F'|' '{ print "ligne " NR " a " NF " champs" }' <<<$VAR
ligne 1 a 26 champs
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 22/03/2011, 15h57   #9
Membre éclairé
 
Avatar de FRUiT
 
Homme
Inscription : février 2011
Messages : 83
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 36
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : février 2011
Messages : 83
Points : 326
Points : 326
Ceci dit moi je répondais au titre du thread qui est :
Citation:
Envoyé par title
Compter le nombre d'occurence d'un caractère donné, par ligne du fichier
Et donc le x=0 était là pour ça
J'aurais du répondre au message au temps pour moi.
__________________
Neon Suite by FRUiT (kde4.6) http://tinyurl.com/yzm7cee
"Pour la carotte, le lapin est la plus parfaite incarnation du mal" (R. Sheckley)
clean
FRUiT est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 22/03/2011, 16h17   #10
Membre éclairé
 
Avatar de FRUiT
 
Homme
Inscription : février 2011
Messages : 83
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 36
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : février 2011
Messages : 83
Points : 326
Points : 326
En ce qui concerne la commande de zipe31 cela pourrait éventuellement s'expliquer par une version de awk différente, ou bien un alias sur awk avec une option qui omet les champs vides...

Pour ce qui est de ma commande c'est quand même beaucoup plus bizarre.
__________________
Neon Suite by FRUiT (kde4.6) http://tinyurl.com/yzm7cee
"Pour la carotte, le lapin est la plus parfaite incarnation du mal" (R. Sheckley)
clean
FRUiT est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 22/03/2011, 17h59   #11
Membre Expert
 
Avatar de Bktero
 
Inscription : juin 2009
Messages : 770
Détails du profil
Informations personnelles :
Âge : 24
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Secteur : Industrie

Informations forums :
Inscription : juin 2009
Messages : 770
Points : 1 290
Points : 1 290
toto.txt étant un fichier où je copie la ligne depuis mon précédent post sur ce forum...


Code :
1
2
3
4
5
6
7
8
9
10
dvligis3@bt1shlnm:/GCFDEV07/dvligis3/pgt>
awk '{ x=1; x+=gsub("\\|",""); print x }' toto.txt
23
dvligis3@bt1shlnm:/GCFDEV07/dvligis3/pgt>
cat toto.txt
Export_D4|Forfait|Gestion des Paiements|FerméDATEDUJOUR|$DATEDUJOUR|_ERCAUTO|_ERCAUTO|$DATEDUJOUR|FACTURE|Recouvrement|Pélitéetard de paiement|FacturéSpain Telecom|Clos|Fermé euros TTC|||$DATEDUJOUR||$DATEDUJOUR|Traitement SpTel|_ERCAUTO|_ERCAUTO|$DATEDUJOUR
dvligis3@bt1shlnm:/GCFDEV07/dvligis3/pgt>
awk -F'|' '{ print "ligne " NR " a " NF " champs" }' toto.txt
ligne 1 a 23 champs
J'adore



Si je tape awk dans ma console, j'obtiens :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
dvligis3@bt1shlnm:/GCFDEV07/dvligis3/pgt>
awk
Usage: awk [POSIX or GNU style options] -f progfile [--] file ...
Usage: awk [POSIX or GNU style options] [--] 'program' file ...
POSIX options:          GNU long options:
        -f progfile             --file=progfile
        -F fs                   --field-separator=fs
        -v var=val              --assign=var=val
        -m[fr] val
        -W compat               --compat
        -W copyleft             --copyleft
        -W copyright            --copyright
        -W dump-variables[=file]        --dump-variables[=file]
        -W exec=file            --exec=file
        -W gen-po               --gen-po
        -W help                 --help
        -W lint[=fatal]         --lint[=fatal]
        -W lint-old             --lint-old
        -W non-decimal-data     --non-decimal-data
        -W profile[=file]       --profile[=file]
        -W posix                --posix
        -W re-interval          --re-interval
        -W source=program-text  --source=program-text
        -W traditional          --traditional
        -W usage                --usage
        -W version              --version

To report bugs, see node `Bugs' in `gawk.info', which is
section `Reporting Problems and Bugs' in the printed version.

gawk is a pattern scanning and processing language.
By default it reads standard input and writes standard output.

Examples:
        gawk '{ sum += $1 }; END { print sum }' file
        gawk -F: '{ print $1 }' /etc/passwd
Ca me parle de gawk à la fin... Une implémentation différente peut-être ?



En revanche, quand je tape alias, il n'y a aucune trace de awk....
__________________
Pour les adeptes du langage SMS, allez ici et ramenez la traduction française ^^

Pour vos problèmes d'embarqué, utilisez le forum dédié !
Bktero est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 22/03/2011, 18h07   #12
Membre éclairé
 
Avatar de FRUiT
 
Homme
Inscription : février 2011
Messages : 83
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 36
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : février 2011
Messages : 83
Points : 326
Points : 326
Ca dit quoi ?

Tu es sur quel type de système ?

Moi ça dit :
Ok, ça doit être un problème d'encodage de caractères, si je copie-colle ta ligne j'ai aussi :
Code :
1
2
> echo "Export_D4|Forfait|Gestion des Paiements|FerméDATEDUJOUR|$DATEDUJOUR|_ERCAUTO|_ERCAUTO|$DATEDUJOUR|FACTURE|Recouvrement|Pélitéetard de paiement|FacturéSpain Telecom|Clos|Fermé euros TTC|||$DATEDUJOUR||$DATEDUJOUR|Traitement SpTel|_ERCAUTO|_ERCAUTO|$DATEDUJOUR" | awk '{ x=1; x+=gsub("\\|",""); print x }'
23
Y'a des petits 'é' un peu partout...

Exemple là il manque une barre et le dollar déjà :
Entre "Fermé" et "$DATEDUJOUR"
__________________
Neon Suite by FRUiT (kde4.6) http://tinyurl.com/yzm7cee
"Pour la carotte, le lapin est la plus parfaite incarnation du mal" (R. Sheckley)
clean
FRUiT est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 22/03/2011, 18h12   #13
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
L'exemple de ligne que tu as donné plus haut et le contenu de ton fichier toto.txt sont différents

Normal que les résultats diffèrent

Code :
1
2
3
4
5
6
7
8
9
10
11
12
$ cat plop     # ton fichier toto.txt
Export_D4|Forfait|Gestion des Paiements|FerméDATEDUJOUR|$DATEDUJOUR|_ERCAUTO|_ERCAUTO|$DATEDUJOUR|FACTURE|Recouvrement|Pélitéetard de paiement|FacturéSpain Telecom|Clos|Fermé euros TTC|||$DATEDUJOUR||$DATEDUJOUR|Traitement SpTel|_ERCAUTO|_ERCAUTO|$DATEDUJOUR

$ awk -F'|' '{ print "ligne " NR " a " NF " champs" }' plop
ligne 1 a 23 champs

$ cat foo     # L'exemple de ligne donné plus haut
Export_D4|Forfait|Gestion des Paiements|Fermé|||_ERCAUTO|_ERCAUTO||FACTURE|Recouvrement|Pénalité retard de paiement|Facturée|Spain Telecom|Clos|Fermé|5 euros TTC||||||Traitement SpTel|_ERCAUTO|_ERCAUTO|

$ awk -F'|' '{ print "ligne " NR " a " NF " champs" }' foo
ligne 1 a 26 champs
$
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 23/03/2011, 09h45   #14
Membre Expert
 
Avatar de Bktero
 
Inscription : juin 2009
Messages : 770
Détails du profil
Informations personnelles :
Âge : 24
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Secteur : Industrie

Informations forums :
Inscription : juin 2009
Messages : 770
Points : 1 290
Points : 1 290
La version de awk est 3.15. Le système est Red Hat (mais je n'en connais pas la version).

Effectivement, je n'avais pas vu que des barres souhaitaient lors du copié-collé ! J'avais vu que les accents partaient en sucette, mais loin de moi l'idée que ça pouvait dégager des barres !

J'utilise vim comme éditeur (via Putty), y a t-il un moyen de ne pas avoir ce remplacement barbare des caractères ?


Désolé pour le dérangement

Et merci pour votre aide !
__________________
Pour les adeptes du langage SMS, allez ici et ramenez la traduction française ^^

Pour vos problèmes d'embarqué, utilisez le forum dédié !
Bktero est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 23/03/2011, 10h23   #15
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
Citation:
Envoyé par Bktero Voir le message
La version de awk est 3.15. Le système est Red Hat (mais je n'en connais pas la version).
Essayes via la commande :

Sinon avec la commande :

Code :
cat /etc/{issue,release,version}

Citation:
Effectivement, je n'avais pas vu que des barres souhaitaient lors du copié-collé ! J'avais vu que les accents partaient en sucette, mais loin de moi l'idée que ça pouvait dégager des barres !

J'utilise vim comme éditeur (via Putty), y a t-il un moyen de ne pas avoir ce remplacement barbare des caractères ?
Dans putty il te faut choisir l'encodage de caractère approprié par rapport à ton système. Ça se configure dans "Windows => Translation".
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 23/03/2011, 15h47   #16
Membre Expert
 
Avatar de Bktero
 
Inscription : juin 2009
Messages : 770
Détails du profil
Informations personnelles :
Âge : 24
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Secteur : Industrie

Informations forums :
Inscription : juin 2009
Messages : 770
Points : 1 290
Points : 1 290
Citation:
LSB Version: :core-3.1-amd64:core-3.1-ia32:core-3.1-noarch:graphics-3.1-amd64:graphics-3.1-ia32:graphics-3.1-noarch
Distributor ID: RedHatEnterpriseServer
Description: Red Hat Enterprise Linux Server release 5.5 (Tikanga)
Release: 5.5
Codename: Tikanga
Je vais essayer pour l'encodage, merci bien
__________________
Pour les adeptes du langage SMS, allez ici et ramenez la traduction française ^^

Pour vos problèmes d'embarqué, utilisez le forum dédié !
Bktero est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h25.


 
 
 
 
Partenaires

Hébergement Web