Mise en forme d'un fichier via un shell
Résolu/Fermé
lucie31000
Messages postés
9
Date d'inscription
samedi 15 septembre 2012
Statut
Membre
Dernière intervention
23 septembre 2012
-
15 sept. 2012 à 17:47
lucie31000 Messages postés 9 Date d'inscription samedi 15 septembre 2012 Statut Membre Dernière intervention 23 septembre 2012 - 23 sept. 2012 à 13:27
lucie31000 Messages postés 9 Date d'inscription samedi 15 septembre 2012 Statut Membre Dernière intervention 23 septembre 2012 - 23 sept. 2012 à 13:27
A voir également:
- Mise en forme d'un fichier via un shell
- Mise en forme conditionnelle excel - Guide
- Comment ouvrir un fichier epub ? - Guide
- Comment réduire la taille d'un fichier - Guide
- Fichier rar - Guide
- Ouvrir un fichier .bin - Guide
11 réponses
jisisv
Messages postés
3645
Date d'inscription
dimanche 18 mars 2001
Statut
Modérateur
Dernière intervention
15 janvier 2017
934
16 sept. 2012 à 08:15
16 sept. 2012 à 08:15
Tu peux utiliser awk qui est un utilitaire standard UNIX:<code><gras>johand@osiris: ~/src/CCM/awk $ cat limits.dat
AAA 100 0:0:0:0:0 Marc Dupont
BBB 200 0:0:0:0:0 Jean Durand
CCC 300 0:0:0:0:0 Alain Duplat
AAA 150 0:0:0:0:0 Marc Dupont
BBB 250 0:0:0:0:0 Jean Durand
CCC 350 0:0:0:0:0 Alain Duplat
johand@osiris: ~/src/CCM/awk $ cat limits.sh
#!/bin/sh
awk -F "\t" '{NAME[$1] = $4;
if ( MIN[$1] > $2 || MIN[$1] == 0)
MIN[$1]= $2 ;
if ( MAX[$1] < $2 )
MAX[$1] =$2;}
END {for (key in NAME )
{ printf("%s\t%s\t%04d>%04d\n", key, NAME[key], MIN[key], MAX[key] ); }
}'| sort
johand@osiris: ~/src/CCM/awk $ ./limits.sh < limits.dat
AAA Marc Dupont 0100>0150
BBB Jean Durand 0200>0250
CCC Alain Duplat 0300>0350
AAA 100 0:0:0:0:0 Marc Dupont
BBB 200 0:0:0:0:0 Jean Durand
CCC 300 0:0:0:0:0 Alain Duplat
AAA 150 0:0:0:0:0 Marc Dupont
BBB 250 0:0:0:0:0 Jean Durand
CCC 350 0:0:0:0:0 Alain Duplat
johand@osiris: ~/src/CCM/awk $ cat limits.sh
#!/bin/sh
awk -F "\t" '{NAME[$1] = $4;
if ( MIN[$1] > $2 || MIN[$1] == 0)
MIN[$1]= $2 ;
if ( MAX[$1] < $2 )
MAX[$1] =$2;}
END {for (key in NAME )
{ printf("%s\t%s\t%04d>%04d\n", key, NAME[key], MIN[key], MAX[key] ); }
}'| sort
johand@osiris: ~/src/CCM/awk $ ./limits.sh < limits.dat
AAA Marc Dupont 0100>0150
BBB Jean Durand 0200>0250
CCC Alain Duplat 0300>0350
lucie31000
Messages postés
9
Date d'inscription
samedi 15 septembre 2012
Statut
Membre
Dernière intervention
23 septembre 2012
16 sept. 2012 à 15:43
16 sept. 2012 à 15:43
Merci de votre réponse rapide.
Mon but est de faire les différentes mises en forme puis d'imprimer le résultat dans la console. J'ai donc intégré votre code à mon shell (car j'ai d'autres mises en forme faites avant) et j'ai donc ceci :
Mais le promp ne me rends pas la main et n'imprime pas les valeurs attendues.
Est-ce que ça ne vient pas de la commande printf utlisée avec le awk ?
Merci bcp.
LD
Mon but est de faire les différentes mises en forme puis d'imprimer le résultat dans la console. J'ai donc intégré votre code à mon shell (car j'ai d'autres mises en forme faites avant) et j'ai donc ceci :
awk -F "\t" '{ ..... }'| sort mon_fichier more mon_fichier
Mais le promp ne me rends pas la main et n'imprime pas les valeurs attendues.
Est-ce que ça ne vient pas de la commande printf utlisée avec le awk ?
Merci bcp.
LD
jisisv
Messages postés
3645
Date d'inscription
dimanche 18 mars 2001
Statut
Modérateur
Dernière intervention
15 janvier 2017
934
16 sept. 2012 à 16:15
16 sept. 2012 à 16:15
Dans ton script tu places le code
Tu adaptera évidemment selon tes besoins
cat fichier_d_origine | awk -F "\t" '{NAME[$1] = $4; if ( MIN[$1] > $2 || MIN[$1] == 0) MIN[$1]= $2 ; if ( MAX[$1] < $2 ) MAX[$1] =$2;} END {for (key in NAME ) { printf("%s\t%s\t%04d>%04d\n", key, NAME[key], MIN[key], MAX[key] ); } }' | sort > fichier_cible
Tu adaptera évidemment selon tes besoins
lucie31000
Messages postés
9
Date d'inscription
samedi 15 septembre 2012
Statut
Membre
Dernière intervention
23 septembre 2012
16 sept. 2012 à 17:18
16 sept. 2012 à 17:18
C'est passé !
Deux remarques :
- Si la valeur min est 0 et que la valeur max est 100, la fonction indique 100>100 C'est bizarre ;)
- Pour la lisibilité, je souhaite ajouter des parenthèses et obtenir AAA (Marc Dupont) 0100>0150
Mais j'ai une erreur de synthaxe sur la ligne :
%04d n'est pas utilisable pour insérer des parenthèses ?
Deux remarques :
- Si la valeur min est 0 et que la valeur max est 100, la fonction indique 100>100 C'est bizarre ;)
- Pour la lisibilité, je souhaite ajouter des parenthèses et obtenir AAA (Marc Dupont) 0100>0150
Mais j'ai une erreur de synthaxe sur la ligne :
{ printf("%s\t%s\t%04d>%04d\n", key, %04d(%04dNAME[key]%04d=%04d, MIN[key], MAX[key] ); }
%04d n'est pas utilisable pour insérer des parenthèses ?
jisisv
Messages postés
3645
Date d'inscription
dimanche 18 mars 2001
Statut
Modérateur
Dernière intervention
15 janvier 2017
934
16 sept. 2012 à 21:40
16 sept. 2012 à 21:40
printf("%s\t(%s)\t%04d>%04d\n", key, NAME[key], MIN[key], MAX[key] );
lucie31000
Messages postés
9
Date d'inscription
samedi 15 septembre 2012
Statut
Membre
Dernière intervention
23 septembre 2012
17 sept. 2012 à 07:51
17 sept. 2012 à 07:51
Merci pour les parenthèses !
Je suis vraiment coincé quand mes valeurs MIN sont à 0, même en mettant
LD
Je suis vraiment coincé quand mes valeurs MIN sont à 0, même en mettant
if ( MIN[$1] > $2), je n'obtiens pas 000>100 par exemple.
LD
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
dubcek
Messages postés
18755
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
14 novembre 2024
5 620
18 sept. 2012 à 15:56
18 sept. 2012 à 15:56
hello
$ awk -F'\t' '{t[$NF] ? c=">": c=""; t[$NF]=t[$NF] c $2; t2[$NF]=$1} END{for(n in t){print t2[n], n, t[n]}}' fichier CCC Alain Duplat 300>350 BBB Jean Durand 200>250 AAA Marc Dupont 100>150 $
lucie31000
Messages postés
9
Date d'inscription
samedi 15 septembre 2012
Statut
Membre
Dernière intervention
23 septembre 2012
18 sept. 2012 à 20:05
18 sept. 2012 à 20:05
bonsoir
merci pour votre contribution, avez vous testé le script avec comme exemple des valeurs min à 0 ? Qui donnerai :
Je suis en déplacement et je ne peux tester le code ;)
Merci
merci pour votre contribution, avez vous testé le script avec comme exemple des valeurs min à 0 ? Qui donnerai :
CCC Alain Duplat 000>350 BBB Jean Durand 000>250 AAA Marc Dupont 000>150
Je suis en déplacement et je ne peux tester le code ;)
Merci
dubcek
Messages postés
18755
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
14 novembre 2024
5 620
19 sept. 2012 à 08:17
19 sept. 2012 à 08:17
que faut-il tester ?
$ cat fichier AAA 000 0:0:0:0:0 Marc Dupont BBB 000 0:0:0:0:0 Jean Durand CCC 000 0:0:0:0:0 Alain Duplat AAA 150 0:0:0:0:0 Marc Dupont BBB 250 0:0:0:0:0 Jean Durand CCC 350 0:0:0:0:0 Alain Duplat $ awk -F'\t' '{t[$NF] ? c=">": c=""; t[$NF]=t[$NF] c $2; t2[$NF]=$1} END{for(n in t){print t2[n], n, t[n]}}' fichier CCC Alain Duplat 000>350 BBB Jean Durand 000>250 AAA Marc Dupont 000>150 $
lucie31000
Messages postés
9
Date d'inscription
samedi 15 septembre 2012
Statut
Membre
Dernière intervention
23 septembre 2012
19 sept. 2012 à 16:58
19 sept. 2012 à 16:58
Oui c'était mon exemple ! merci de l'avoir testé, il me tarde de le valider sur ma machine ..
Pour obtenir :
CCC (Alain Duplat) 000>350
C'est comme ça qu'il faut placer les parenthèses dans le code ?
Pour obtenir :
CCC (Alain Duplat) 000>350
C'est comme ça qu'il faut placer les parenthèses dans le code ?
awk -F'%s\t(%s)\t ...
dubcek
Messages postés
18755
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
14 novembre 2024
5 620
20 sept. 2012 à 07:51
20 sept. 2012 à 07:51
$ awk -F'\t' '{t[$NF] ? c=">": c=""; t[$NF]=t[$NF] c $2; t2[$NF]=$1} END{for(n in t){print t2[n], "(" n ")", t[n]}}' a1 CCC (Alain Duplat) 000>350 BBB (Jean Durand) 000>250 AAA (Marc Dupont) 000>150 $ $
lucie31000
Messages postés
9
Date d'inscription
samedi 15 septembre 2012
Statut
Membre
Dernière intervention
23 septembre 2012
22 sept. 2012 à 08:51
22 sept. 2012 à 08:51
Bonjour,
Je suis trés satisfait du résultat ! Merci dubcek et jisisv
Je me suis apperçu que quand les données n'étaient pas classées dans le même ordre, par exemple :
AAA 150 0:0:0:0:0 Marc Dupont
BBB 250 0:0:0:0:0 Jean Durand
CCC 350 0:0:0:0:0 Alain Duplat
AAA 000 0:0:0:0:0 Marc Dupont
BBB 000 0:0:0:0:0 Jean Durand
CCC 000 0:0:0:0:0 Alain Duplat
J'obtenanait :
CCC Alain Duplat 350>000
BBB Jean Durand 250>000
AAA Marc Dupont 150>000
Confirmez-moi SVP dubcek, que dans votre script, il n'y a pas d'opération de comparaison de valeur (l'une suppérieure à l'autre) mais plutôt la première vue par rapport à la suivante (ayant le même nom); ce qui expliquerait ce résultat.
LD
Je suis trés satisfait du résultat ! Merci dubcek et jisisv
Je me suis apperçu que quand les données n'étaient pas classées dans le même ordre, par exemple :
AAA 150 0:0:0:0:0 Marc Dupont
BBB 250 0:0:0:0:0 Jean Durand
CCC 350 0:0:0:0:0 Alain Duplat
AAA 000 0:0:0:0:0 Marc Dupont
BBB 000 0:0:0:0:0 Jean Durand
CCC 000 0:0:0:0:0 Alain Duplat
J'obtenanait :
CCC Alain Duplat 350>000
BBB Jean Durand 250>000
AAA Marc Dupont 150>000
Confirmez-moi SVP dubcek, que dans votre script, il n'y a pas d'opération de comparaison de valeur (l'une suppérieure à l'autre) mais plutôt la première vue par rapport à la suivante (ayant le même nom); ce qui expliquerait ce résultat.
LD
dubcek
Messages postés
18755
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
14 novembre 2024
5 620
22 sept. 2012 à 11:13
22 sept. 2012 à 11:13
non, il n'y a pas de comparaison. les valeurs sont concaténées pour un même nom.
effectivment l'ordre change, est ce que c'est un problème ?
c'est dû à t[$NF]=t[$NF] qui utilise le nom comme index et pas un index numérique
effectivment l'ordre change, est ce que c'est un problème ?
c'est dû à t[$NF]=t[$NF] qui utilise le nom comme index et pas un index numérique
lucie31000
Messages postés
9
Date d'inscription
samedi 15 septembre 2012
Statut
Membre
Dernière intervention
23 septembre 2012
23 sept. 2012 à 06:34
23 sept. 2012 à 06:34
Ca passe, dans la mesure ou je trie les nombres pour les présenter : d'abord valeur min puis valeur max.
Du coup la comparaison de votre script fonctionne bien !
Comment faire la comparaison sur la première colonne ? L'index serait "AAA" par exemple ?
J'ai bien essayé
Merci,
LD
Du coup la comparaison de votre script fonctionne bien !
Comment faire la comparaison sur la première colonne ? L'index serait "AAA" par exemple ?
J'ai bien essayé
awk -F'\t' '{t[$0] ...mais le résultat est NOK
Merci,
LD
dubcek
Messages postés
18755
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
14 novembre 2024
5 620
23 sept. 2012 à 12:30
23 sept. 2012 à 12:30
$0 c'est la ligne entière, $1 est le premier champ
$ awk -F'\t' '{t[$1] ? c=">": c=""; t[$1]=t[$1] c $2; t2[$1]=$NF} END{for(n in t){print n, "(" t2[n] ")", t[n]}}' a1 AAA (Marc Dupont) 000>150 CCC (Alain Duplat) 000>350 BBB (Jean Durand) 000>250 $
lucie31000
Messages postés
9
Date d'inscription
samedi 15 septembre 2012
Statut
Membre
Dernière intervention
23 septembre 2012
23 sept. 2012 à 13:27
23 sept. 2012 à 13:27
Super !
Encore merci.
PS : cloturer le post
Encore merci.
PS : cloturer le post