Modifier un fichier texte avec awk en bash... (Mac)
Résolu/Fermé
MAMu_
Messages postés
48
Date d'inscription
mercredi 3 avril 2013
Statut
Membre
Dernière intervention
25 mai 2013
-
3 avril 2013 à 16:02
dubcek Messages postés 18755 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 14 novembre 2024 - 26 mai 2013 à 10:22
dubcek Messages postés 18755 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 14 novembre 2024 - 26 mai 2013 à 10:22
A voir également:
- Gawk mac
- Adresse mac - Guide
- Nettoyer mac - Guide
- @ Sur mac - Guide
- Temperature mac - Guide
- Commande terminal mac - Guide
51 réponses
MAMu_
Messages postés
48
Date d'inscription
mercredi 3 avril 2013
Statut
Membre
Dernière intervention
25 mai 2013
18 avril 2013 à 17:59
18 avril 2013 à 17:59
pas tout suivi là... je vais essayer d'appliquer, ou mets tu ton
/<game / {ns=sprintf("%05d", ++n); if(nl++)print ""}
dans ton code...
Pourquoi le sort...? pour, une fois le champ description en premier de chaque lignes, classer chaque ligne par ordre alphabetique (donc selon description et non plus short name name=)...
ensuite je remet mes numeros 00001 00002...
et je charge donc mes variables en n+1 dans flash dans l'ordre alphabetique de description et non plus name...
Non..?
/<game / {ns=sprintf("%05d", ++n); if(nl++)print ""}
dans ton code...
Pourquoi le sort...? pour, une fois le champ description en premier de chaque lignes, classer chaque ligne par ordre alphabetique (donc selon description et non plus short name name=)...
ensuite je remet mes numeros 00001 00002...
et je charge donc mes variables en n+1 dans flash dans l'ordre alphabetique de description et non plus name...
Non..?
dubcek
Messages postés
18755
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
14 novembre 2024
5 621
19 avril 2013 à 08:50
19 avril 2013 à 08:50
si je prends les 2 premières balises, tu les veux comment ?
name00001="005"; sourcefile00001="segag80r.c"; description00001="005"; year00001="1981"; manufacturer00001="Sega"; type00001="raster"; rotate00001="270"; width00001="256"; height00001="224"; status00001="imperfect"; emulation00001="good"; color00001="good"; sound00001="imperfect"; graphic00001="good"; name00002="10yard"; sourcefile00002="m58.c"; description00002="10-Yard Fight (World, set 1)"; year00002="1983"; manufacturer00002="Irem"; type00002="raster"; rotate00002="0"; width00002="256"; height00002="224"; status00002="good"; emulation00002="good"; color00002="good"; sound00002="good"; graphic00002="good";
MAMu_
Messages postés
48
Date d'inscription
mercredi 3 avril 2013
Statut
Membre
Dernière intervention
25 mai 2013
19 avril 2013 à 13:50
19 avril 2013 à 13:50
En fait je crois que ca devra être fait en plusieurs étapes :
au final, le fichier sera comme avant, cad tout sur une ligne à la suite, séparé par des & et sans les guillemets... mais en ayant auparavant inversé les champs name et description de maniere à ce que chaque groupe de variables commence par description, et en ayant avant la mise en forme finale mis chaque groupe par ordre alphabetique...
Je crois donc que la methode à suivre est la suivante :
1/chaque groupe sur une seule ligne à la suite sans les numéros (pour classer par ordre alphabetique plus tard en etape 3...) :
name=005&sourcefile=segag80r.c&description=005&...
name=10yard&sourcefile=m58.c&descrition=10-Yard Fight (World, set 1)&...
2/inverser pour chaque ligne les variables "name=xxxx" et "description=xxxx" de manière à ce que chaque ligne commence par la description...
3/faire un sort sur le fichier obtenu, tous mes groupes sont donc bien dans l'ordre alphabétique de "description"
4/remettre les numéros, supprimer le retour de ligne à la fin de chaque ligne...
au final, le fichier sera comme avant, cad tout sur une ligne à la suite, séparé par des & et sans les guillemets... mais en ayant auparavant inversé les champs name et description de maniere à ce que chaque groupe de variables commence par description, et en ayant avant la mise en forme finale mis chaque groupe par ordre alphabetique...
Je crois donc que la methode à suivre est la suivante :
1/chaque groupe sur une seule ligne à la suite sans les numéros (pour classer par ordre alphabetique plus tard en etape 3...) :
name=005&sourcefile=segag80r.c&description=005&...
name=10yard&sourcefile=m58.c&descrition=10-Yard Fight (World, set 1)&...
2/inverser pour chaque ligne les variables "name=xxxx" et "description=xxxx" de manière à ce que chaque ligne commence par la description...
3/faire un sort sur le fichier obtenu, tous mes groupes sont donc bien dans l'ordre alphabétique de "description"
4/remettre les numéros, supprimer le retour de ligne à la fin de chaque ligne...
MAMu_
Messages postés
48
Date d'inscription
mercredi 3 avril 2013
Statut
Membre
Dernière intervention
25 mai 2013
19 avril 2013 à 14:08
19 avril 2013 à 14:08
au final je vais garder chaque variables.txt obtenu, en chargeant ceux ci selon le choix de l'utilisateur, j'obtiendrais donc une liste qui pourra etre trièe par ordre alphabetique, par zip name, par manufacturer, par année et par system...
Il faudra donc que j'inverse plusieurs champs et que je fasse un sort pour chaque cas de figure... (commence par short name, commence par description, commence par year/description, commence par Manufacturer/Description, et enfin commence par source/Description....)
Il faudra donc que j'inverse plusieurs champs et que je fasse un sort pour chaque cas de figure... (commence par short name, commence par description, commence par year/description, commence par Manufacturer/Description, et enfin commence par source/Description....)
dubcek
Messages postés
18755
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
14 novembre 2024
5 621
Modifié par dubcek le 19/04/2013 à 14:14
Modifié par dubcek le 19/04/2013 à 14:14
tu supprimes les No pour quand on trie :
mais on peut trier uniquement après le =
tout sur UNE SEULE ligne ou une ligne par description/name ?
description00001="005"; description00002="10-Yard Fight (World, set 1)";il ne compte pas dans le tri ?
mais on peut trier uniquement après le =
tout sur UNE SEULE ligne ou une ligne par description/name ?
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
MAMu_
Messages postés
48
Date d'inscription
mercredi 3 avril 2013
Statut
Membre
Dernière intervention
25 mai 2013
19 avril 2013 à 14:55
19 avril 2013 à 14:55
oui mais comme c'est le numero qui place ma variable dans le frontend... il faut que je numerote une fois le tri effectué... enfin.. selon ma logique...
là je me retrouve avec :
name="005"&sourcefile="segag80r.c"&description="005"&year="1981"&manufacturer="Sega"&type="raster"&rotate="270"&width="256"&height="224"&status="imperfect"&emulation="good"&color="good"&sound="imperfect"&graphic="good"
name="10yard"&sourcefile="m58.c"&description="10-Yard Fight (World, set 1)"&year="1983"&manufacturer="Irem"&type="raster"&rotate="0"&width="256"&height="224"&status="good"&emulation="good"&color="good"&sound="good"&graphic="good"
name="10yard85"&sourcefile="m58.c"&cloneof="10yard"&description="10-Yard Fight '85 (US, Taito license)"&year="1985"&manufacturer="Irem (Taito license)"&type="raster"&rotate="0"&width="256"&height="224"&status="good"&emulation="good"&color="good"&sound="good"&graphic="good"
name="10yardj"&sourcefile="m58.c"&cloneof="10yard"&description="10-Yard Fight (Japan)"&year="1983"&manufacturer="Irem"&type="raster"&rotate="0"&width="256"&height="224"&status="good"&emulation="good"&color="good"&sound="good"&graphic="good"
name="11beat"&sourcefile="aleck64.c"&description="Eleven Beat"&year="1998"&manufacturer="Hudson"&type="raster"&rotate="0"&width="640"&height="240"&status="preliminary"&emulation="preliminary"&color="good"&sound="preliminary"&graphic="good"
name="18w"&sourcefile="mw18w.c"&ismechanical="yes"&description="18 Wheeler (set 1)"&year="1979"&manufacturer="Midway"&status="preliminary"&emulation="preliminary"&color="good"&sound="preliminary"&graphic="good"
name="18w2"&sourcefile="mw18w.c"&ismechanical="yes"&cloneof="18w"&description="18 Wheeler (set 2)"&year="1979"&manufacturer="Midway"&status="preliminary"&emulation="preliminary"&color="good"&sound="preliminary"&graphic="good"
name="18wheelr"&sourcefile="naomi.c"&description="18 Wheeler Deluxe (Rev A) (JPN)"&year="2000"&manufacturer="Sega"&type="raster"&rotate="0"&width="640"&height="480"&status="preliminary"&emulation="preliminary"&color="good"&sound="imperfect"&graphic="imperfect"
name="18wheels"&sourcefile="naomi.c"&cloneof="18wheelr"&description="18 Wheeler (Rev A) (JPN)"&year="2000"&manufacturer="Sega"&type="raster"&rotate="0"&width="640"&height="480"&status="preliminary"&emulation="preliminary"&color="good"&sound="imperfect"&graphic="imperfect"
name="1941"&sourcefile="cps1.c"&description="1941: Counter Attack (World 900227)"&year="1990"&manufacturer="Capcom"&type="raster"&rotate="270"&width="384"&height="224"&status="good"&emulation="good"&color="good"&sound="good"&graphic="good"
name="1941j"&sourcefile="cps1.c"&cloneof="1941"&description="1941: Counter Attack (Japan)"&year="1990"&manufacturer="Capcom"&type="raster"&rotate="270"&width="384"&height="224"&status="good"&emulation="good"&color="good"&sound="good"&graphic="good"
name="1941r1"&sourcefile="cps1.c"&cloneof="1941"&description="1941: Counter Attack (World)"&year="1990"&manufacturer="Capcom"&type="raster"&rotate="270"&width="384"&height="224"&status="good"&emulation="good"&color="good"&sound="good"&graphic="good"
name="1941u"&sourcefile="cps1.c"&cloneof="1941"&description="1941: Counter Attack (USA 900227)"&year="1990"&manufacturer="Capcom"&type="raster"&rotate="270"&width="384"&height="224"&status="good"&emulation="good"&color="good"&sound="good"&graphic="good"
soit chaque groupe de variables sur une ligne...
comment faire pour inverser dans chaque ligne name="valeur" avec description="valeur"...?
J'ai bien trouvé cette commande :
awk -F\; '{print $1";"$2";"$4";"$3";"$5}' le_fichier_a_traiter > nom_du_fichier_de_sortie
mais comme le nombre de colonnes n'est pas fixe... ca ne peut pas marcher (ismechanical n'est pas tout le temps present par exemple...)
là je me retrouve avec :
name="005"&sourcefile="segag80r.c"&description="005"&year="1981"&manufacturer="Sega"&type="raster"&rotate="270"&width="256"&height="224"&status="imperfect"&emulation="good"&color="good"&sound="imperfect"&graphic="good"
name="10yard"&sourcefile="m58.c"&description="10-Yard Fight (World, set 1)"&year="1983"&manufacturer="Irem"&type="raster"&rotate="0"&width="256"&height="224"&status="good"&emulation="good"&color="good"&sound="good"&graphic="good"
name="10yard85"&sourcefile="m58.c"&cloneof="10yard"&description="10-Yard Fight '85 (US, Taito license)"&year="1985"&manufacturer="Irem (Taito license)"&type="raster"&rotate="0"&width="256"&height="224"&status="good"&emulation="good"&color="good"&sound="good"&graphic="good"
name="10yardj"&sourcefile="m58.c"&cloneof="10yard"&description="10-Yard Fight (Japan)"&year="1983"&manufacturer="Irem"&type="raster"&rotate="0"&width="256"&height="224"&status="good"&emulation="good"&color="good"&sound="good"&graphic="good"
name="11beat"&sourcefile="aleck64.c"&description="Eleven Beat"&year="1998"&manufacturer="Hudson"&type="raster"&rotate="0"&width="640"&height="240"&status="preliminary"&emulation="preliminary"&color="good"&sound="preliminary"&graphic="good"
name="18w"&sourcefile="mw18w.c"&ismechanical="yes"&description="18 Wheeler (set 1)"&year="1979"&manufacturer="Midway"&status="preliminary"&emulation="preliminary"&color="good"&sound="preliminary"&graphic="good"
name="18w2"&sourcefile="mw18w.c"&ismechanical="yes"&cloneof="18w"&description="18 Wheeler (set 2)"&year="1979"&manufacturer="Midway"&status="preliminary"&emulation="preliminary"&color="good"&sound="preliminary"&graphic="good"
name="18wheelr"&sourcefile="naomi.c"&description="18 Wheeler Deluxe (Rev A) (JPN)"&year="2000"&manufacturer="Sega"&type="raster"&rotate="0"&width="640"&height="480"&status="preliminary"&emulation="preliminary"&color="good"&sound="imperfect"&graphic="imperfect"
name="18wheels"&sourcefile="naomi.c"&cloneof="18wheelr"&description="18 Wheeler (Rev A) (JPN)"&year="2000"&manufacturer="Sega"&type="raster"&rotate="0"&width="640"&height="480"&status="preliminary"&emulation="preliminary"&color="good"&sound="imperfect"&graphic="imperfect"
name="1941"&sourcefile="cps1.c"&description="1941: Counter Attack (World 900227)"&year="1990"&manufacturer="Capcom"&type="raster"&rotate="270"&width="384"&height="224"&status="good"&emulation="good"&color="good"&sound="good"&graphic="good"
name="1941j"&sourcefile="cps1.c"&cloneof="1941"&description="1941: Counter Attack (Japan)"&year="1990"&manufacturer="Capcom"&type="raster"&rotate="270"&width="384"&height="224"&status="good"&emulation="good"&color="good"&sound="good"&graphic="good"
name="1941r1"&sourcefile="cps1.c"&cloneof="1941"&description="1941: Counter Attack (World)"&year="1990"&manufacturer="Capcom"&type="raster"&rotate="270"&width="384"&height="224"&status="good"&emulation="good"&color="good"&sound="good"&graphic="good"
name="1941u"&sourcefile="cps1.c"&cloneof="1941"&description="1941: Counter Attack (USA 900227)"&year="1990"&manufacturer="Capcom"&type="raster"&rotate="270"&width="384"&height="224"&status="good"&emulation="good"&color="good"&sound="good"&graphic="good"
soit chaque groupe de variables sur une ligne...
comment faire pour inverser dans chaque ligne name="valeur" avec description="valeur"...?
J'ai bien trouvé cette commande :
awk -F\; '{print $1";"$2";"$4";"$3";"$5}' le_fichier_a_traiter > nom_du_fichier_de_sortie
mais comme le nombre de colonnes n'est pas fixe... ca ne peut pas marcher (ismechanical n'est pas tout le temps present par exemple...)
MAMu_
Messages postés
48
Date d'inscription
mercredi 3 avril 2013
Statut
Membre
Dernière intervention
25 mai 2013
19 avril 2013 à 14:58
19 avril 2013 à 14:58
si je reussi à manipuler l'ordre des champs sur chaque ligne, j'ai plus qu'à le faire autant de fois que je veux d'ordre de tri, et repasser enfin la moulinette sur chaque fichier obtenus:
ajouter numero, supprimer le /n en fin de ligne, et supprimer les caracteres <,>,etc qui posent problèmes (& gt, & lt...)
ajouter numero, supprimer le /n en fin de ligne, et supprimer les caracteres <,>,etc qui posent problèmes (& gt, & lt...)
dubcek
Messages postés
18755
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
14 novembre 2024
5 621
19 avril 2013 à 15:00
19 avril 2013 à 15:00
ok, donc des lignes
description=.XXX&name=...
description=AAA&name=...
on trie puis on numérote
description00001=AAA&name00001=...
description00002=XXX&name00002=...
description=.XXX&name=...
description=AAA&name=...
on trie puis on numérote
description00001=AAA&name00001=...
description00002=XXX&name00002=...
MAMu_
Messages postés
48
Date d'inscription
mercredi 3 avril 2013
Statut
Membre
Dernière intervention
25 mai 2013
19 avril 2013 à 15:01
19 avril 2013 à 15:01
exactement...
dubcek
Messages postés
18755
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
14 novembre 2024
5 621
Modifié par dubcek le 19/04/2013 à 16:02
Modifié par dubcek le 19/04/2013 à 16:02
essaye ça.
$ awk -f f5.awk listfull.xml | sort -t '&' -k 1 | awk '{ns=sprintf("%05d", ++n); gsub("=", ns "="); print}' $ cat f5.awk BEGIN {FS="[ \t>]+"; v="name=|sourcefile=|ismechanical=|cloneof=|type=|rotate=|width=|height=|status=|emulation=|color=|sound=|graphic=" ; c="&"} /<game / {gsub("\"", "", $3); name=$3; if(nl++)print ""} /<display |<driver / {for(f=2; f<=NF; f++){if($f ~ v){sub("=", ns "=", $f); gsub("\"", "", $f); printf $f c }}} /<description>/ {gsub("%", "%%"); gsub("&", "and"); split($0, t, "[<>]"); printf t[2] ns "=" t[3] c name c} /<year>|<manufacturer>/ {gsub("%", "%%"); gsub("&", "and"); split($0, t, "[<>]"); printf t[2] ns "=" t[3] c}si c'est ce que tu veux, je simplifierai f5.awk
MAMu_
Messages postés
48
Date d'inscription
mercredi 3 avril 2013
Statut
Membre
Dernière intervention
25 mai 2013
19 avril 2013 à 16:47
19 avril 2013 à 16:47
... :/
Alors:
le fichier awk avec BEGIN {... c}, ok... (je l'ai appelé description.awk)
la commande awk -f description.awk listfull.xml > description.txt, ok
j'obtiens ligne par ligne sans numero, et bien avec Description en premier...
mais en dos, le sort -t '&' -k 1, que je le mette à la suite, ou seul, me met des messages d'erreur :
Fichier d'entrée spécifié deux fois.
''' n'est pas reconnu en tant que commande interne
ou externe, un programme exécutable ou un fichier de commandes.
Je le remplace simplement par sort description.txt > description2.txt
J'obtiens bien toutes les lignes triées par ordre alphabétique comme il faut... :)
Enfin, la deuxième commande awk (que je suis obligé de passer par un fichier externe -f num.awk)
ajoute bien l'incrementation pour chaque variables...
parfait... :) il suffit juste ensuite de faire sauter tous les retours à la ligne, et mon fichier est nickel...
pourrais tu m'expliquer dans description.awk avec quelle commande tu mets le champ description en debut de ligne...? que j'adapte pour d'autres ordres de tris...
Merci :)
PS: ca te derange pas que je te cite dans les credits de mon frontend...?
Parce que vraiment tu m'es d'une aide impressionante... :)
Alors:
le fichier awk avec BEGIN {... c}, ok... (je l'ai appelé description.awk)
la commande awk -f description.awk listfull.xml > description.txt, ok
j'obtiens ligne par ligne sans numero, et bien avec Description en premier...
mais en dos, le sort -t '&' -k 1, que je le mette à la suite, ou seul, me met des messages d'erreur :
Fichier d'entrée spécifié deux fois.
''' n'est pas reconnu en tant que commande interne
ou externe, un programme exécutable ou un fichier de commandes.
Je le remplace simplement par sort description.txt > description2.txt
J'obtiens bien toutes les lignes triées par ordre alphabétique comme il faut... :)
Enfin, la deuxième commande awk (que je suis obligé de passer par un fichier externe -f num.awk)
ajoute bien l'incrementation pour chaque variables...
parfait... :) il suffit juste ensuite de faire sauter tous les retours à la ligne, et mon fichier est nickel...
pourrais tu m'expliquer dans description.awk avec quelle commande tu mets le champ description en debut de ligne...? que j'adapte pour d'autres ordres de tris...
Merci :)
PS: ca te derange pas que je te cite dans les credits de mon frontend...?
Parce que vraiment tu m'es d'une aide impressionante... :)
MAMu_
Messages postés
48
Date d'inscription
mercredi 3 avril 2013
Statut
Membre
Dernière intervention
25 mai 2013
19 avril 2013 à 16:48
19 avril 2013 à 16:48
ne tiens pas compte du " ... :/ " en debut de message, c'etait à cause du sort, mais j'ai trouvé la solution ensuite comme expliqué plus bas...
dubcek
Messages postés
18755
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
14 novembre 2024
5 621
Modifié par dubcek le 19/04/2013 à 17:07
Modifié par dubcek le 19/04/2013 à 17:07
j'avais oublié la compatiblité DOS
il faut donc TOUT SUR UNE SEULE LIGNE ?
quel awk sur DOS awk --version? le gawk, GNU awk a des fonctions de tri : asort, asorti
il faut donc TOUT SUR UNE SEULE LIGNE ?
quel awk sur DOS awk --version? le gawk, GNU awk a des fonctions de tri : asort, asorti
MAMu_
Messages postés
48
Date d'inscription
mercredi 3 avril 2013
Statut
Membre
Dernière intervention
25 mai 2013
19 avril 2013 à 17:15
19 avril 2013 à 17:15
J'utilises "awk.exe" , awk.exe --version me sort ceci :
GNU Awk 3.1.6
Copyright (C) 1989, 1991-2007 Free Software Foundation.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see http://www.gnu.org/licenses/
Au final oui, il me faut tout sur une seule ligne mais je sais le faire grace à toi ^^, pour que ce soit compatible et reconnu par flash...
GNU Awk 3.1.6
Copyright (C) 1989, 1991-2007 Free Software Foundation.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see http://www.gnu.org/licenses/
Au final oui, il me faut tout sur une seule ligne mais je sais le faire grace à toi ^^, pour que ce soit compatible et reconnu par flash...
dubcek
Messages postés
18755
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
14 novembre 2024
5 621
Modifié par dubcek le 20/04/2013 à 12:06
Modifié par dubcek le 20/04/2013 à 12:06
ceci fonctionne sur DOS et Linux, mais sort DOS ne retourne pas la même chose que sort Linux
C:> awk -f f5.awk listfull.xml > z1 C:> sort z1 > z2 C:> awk -f f6.awk z2 > z3 ou C:> awk -f f5.awk listfull.xml | sort | awk -f f6.awk > z4 C:> type f5.awk BEGIN {FS="[ \t>]+"; v="sourcefile=|ismechanical=|cloneof=|type=|rotate=|width=|height=|status=|emulation=|color=|sound=|graphic=" ; c="&"} /<game |<display |<driver |<description>|<year>|<manufacturer>/ {gsub("\"", ""); gsub("%", "%%"); gsub("&", "and")} /<game / {name=$3; if(nl++)print ""} /<display |<driver / {for(f=2; f<=NF; f++)if($f ~ v)printf $f c } /<description>|<year>|<manufacturer>/ {na=""; if($0 ~ /descript/)na=name c; split($0, t, "[<>]"); printf t[2] "=" t[3] c na} C:> type f6.awk {gsub("%", "%%"); ns=sprintf("%05d", ++n); gsub("=", ns "="); printf $0}
dubcek
Messages postés
18755
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
14 novembre 2024
5 621
20 avril 2013 à 13:44
20 avril 2013 à 13:44
pour avoir le minmum de différences entre les sort , utiliser : sort /l C sur DOS, sort -f sur Linux
MAMu_
Messages postés
48
Date d'inscription
mercredi 3 avril 2013
Statut
Membre
Dernière intervention
25 mai 2013
20 avril 2013 à 15:45
20 avril 2013 à 15:45
merci je vais tester ca direct :)
MAMu_
Messages postés
48
Date d'inscription
mercredi 3 avril 2013
Statut
Membre
Dernière intervention
25 mai 2013
20 avril 2013 à 15:46
20 avril 2013 à 15:46
pourrais tu m'expliquer dans f5.awk avec quelle ligne mets tu le champ "description" en premier...?
Que je puisse essayer de sortir plusieurs fichiers...
Que je puisse essayer de sortir plusieurs fichiers...
dubcek
Messages postés
18755
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
14 novembre 2024
5 621
20 avril 2013 à 16:03
20 avril 2013 à 16:03
je stocke le nom name=nom dans une variable name
/<game / {name=$3; if(nl++)print ""}et je l'affiche après la description
/<description>|<year>|<manufacturer>/ {na=""; if($0 ~ /descript/)na=name c; split($0, t, "[<>]"); printf t[2] "=" t[3] c na}
MAMu_
Messages postés
48
Date d'inscription
mercredi 3 avril 2013
Statut
Membre
Dernière intervention
25 mai 2013
20 avril 2013 à 16:21
20 avril 2013 à 16:21
dans le fichier obtenu, tous les champs sourcefile ont disparus en sortie... et peut être, voir surement, d'autres champs :/
avant mon variables3.txt obtenu faisait 8 Mo...
maintenant le fichier en sortie fait 2,8 Mo...
avant mon variables3.txt obtenu faisait 8 Mo...
maintenant le fichier en sortie fait 2,8 Mo...
dubcek
Messages postés
18755
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
14 novembre 2024
5 621
20 avril 2013 à 16:47
20 avril 2013 à 16:47
juste
essaye ca, corrigé f5.awk
essaye ca, corrigé f5.awk
BEGIN {FS="[ \t>]+"; v="sourcefile=|ismechanical=|cloneof=|type=|rotate=|width=|height=|status=|emulation=|color=|sound=|graphic=" ; c="&"} /<game |<display |<driver |<description>|<year>|<manufacturer>/ {gsub("\"", ""); gsub("%", "%%"); gsub("&", "and")} /<game / {name=$3; for(f=4; f<=NF; f++)if($f ~ v)printf $f c; if(nl++)print ""} /<display |<driver / {for(f=2; f<=NF; f++)if($f ~ v)printf $f c } /<description>|<year>|<manufacturer>/ {na=""; if($0 ~ /descript/)na=name c; split($0, t, "[<>]"); printf t[2] "=" t[3] c na}
dubcek
Messages postés
18755
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
14 novembre 2024
5 621
Modifié par dubcek le 20/04/2013 à 17:33
Modifié par dubcek le 20/04/2013 à 17:33
il y a encore une erreur, 1 ligne commence par sourcefile,
je regarde
edit : essayer ce code:
je regarde
edit : essayer ce code:
BEGIN {FS="[ \t>]+"; v="sourcefile=|ismechanical=|cloneof=|type=|rotate=|width=|height=|status=|emulation=|color=|sound=|graphic=" ; c="&"} /<game |<display |<driver |<description>|<year>|<manufacturer>/ {gsub("\"", ""); gsub("%", "%%"); gsub("&", "and")} /<game / {name=$3; for(f=4; f<=NF; f++)if($f ~ v)name=name c $f; if(nl++)print ""} /<display |<driver / {for(f=2; f<=NF; f++)if($f ~ v)printf $f c } /<description>|<year>|<manufacturer>/ {na=""; if($0 ~ /descript/)na=name c; split($0, t, "[<>]"); printf t[2] "=" t[3] c na}
MAMu_
Messages postés
48
Date d'inscription
mercredi 3 avril 2013
Statut
Membre
Dernière intervention
25 mai 2013
20 avril 2013 à 18:16
20 avril 2013 à 18:16
Mieux.. mais il doit encore manquer des champs...
6Mo au lieu de 8...
pas facile de trouver lesquels au milieu de ce fichier :) ^^
je vais comparer avec l'ancien et je te dis...
6Mo au lieu de 8...
pas facile de trouver lesquels au milieu de ce fichier :) ^^
je vais comparer avec l'ancien et je te dis...
MAMu_
Messages postés
48
Date d'inscription
mercredi 3 avril 2013
Statut
Membre
Dernière intervention
25 mai 2013
20 avril 2013 à 18:18
20 avril 2013 à 18:18
le plus simple, je vais modifier mon fichier flash pour qu'il m'affiche mes variables... pour l'instant je ne traite que "description" et "manufacturer"... je vais afficher toutes mes variables... comme ca je saurait direct celles qu'il manque selon le fichier chargé...
MAMu_
Messages postés
48
Date d'inscription
mercredi 3 avril 2013
Statut
Membre
Dernière intervention
25 mai 2013
20 avril 2013 à 20:00
20 avril 2013 à 20:00
sourcefile, ismechanical, et cloneof sont les 3 grands absents ^^
Mes variables restent sur undefined...
Mes variables restent sur undefined...
dubcek
Messages postés
18755
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
14 novembre 2024
5 621
21 avril 2013 à 09:59
21 avril 2013 à 09:59
est-ce le bon f5.awk ?
$ awk -f f5.awk listfull.xml | sort -f > a0 $ grep -c 'sourcefile' a0 28473 $ grep -c 'cloneof' a0 19696 $ grep -c 'ismechanical' a0 9066 $ $ awk -f f5.awk listfull.xml | sort -f | awk -f f6.awk > a00 $ grep -o 'sourcefile[0-9]*=' a00 | wc -l 28473 $ grep -o 'cloneof[0-9]*=' a00 | wc -l 19696 $ grep -o 'ismechanical[0-9]*=' a00 | wc -l 9066 $ $ cat f5.awk BEGIN {FS="[ \t>]+"; v="sourcefile=|ismechanical=|cloneof=|type=|rotate=|width=|height=|status=|emulation=|color=|sound=|graphic=" ; c="&"} /<game |<display |<driver |<description>|<year>|<manufacturer>/ {gsub("\"", ""); gsub("%", "%%"); gsub("&", "and")} /<game / {name=$3; for(f=4; f<=NF; f++)if($f ~ v)name=name c $f; if(nl++)print ""} /<display |<driver / {for(f=2; f<=NF; f++)if($f ~ v)printf $f c } /<description>|<year>|<manufacturer>/ {na=""; if($0 ~ /descript/)na=name c; split($0, t, "[<>]"); printf t[2] "=" t[3] c na}
MAMu_
Messages postés
48
Date d'inscription
mercredi 3 avril 2013
Statut
Membre
Dernière intervention
25 mai 2013
21 avril 2013 à 13:55
21 avril 2013 à 13:55
Merci, en effet il me manquait quelques lignes... ca marche parfaitement... :)
du moins je l'espere.. Mais à première vue tout est bon...
Merci :)
du moins je l'espere.. Mais à première vue tout est bon...
Merci :)
MAMu_
Messages postés
48
Date d'inscription
mercredi 3 avril 2013
Statut
Membre
Dernière intervention
25 mai 2013
27 avril 2013 à 05:50
27 avril 2013 à 05:50
tout marche impec, merci dubcek :)
pour le shortname (name=) (avec f5.awk) et le nom complet (description=) (avec sort)
, toutes mes variables sont bien recupérées dans mon flash et je les manipule sans problèmes..
Par contre j'ai toujours pas compris comment inverser des colonnes... :/
Car si maintenant et avant de passer au num.awk, j'ai besoin que le premier champ de chaques lignes de mon variables.txt soit l'année (year=), puis la description, name...
ou encore Manufacturer, puis la description si je veux classer par compagnies puis nom... etc...
J'ai beau essayé de modifier ton f5.awk, les deux fameuses lignes que tu m'as expliquée au moment de "swapper" description, pas moyen de creer d'autres ordres de tri sans tout casser...
Désolé... :/
pour le shortname (name=) (avec f5.awk) et le nom complet (description=) (avec sort)
, toutes mes variables sont bien recupérées dans mon flash et je les manipule sans problèmes..
Par contre j'ai toujours pas compris comment inverser des colonnes... :/
Car si maintenant et avant de passer au num.awk, j'ai besoin que le premier champ de chaques lignes de mon variables.txt soit l'année (year=), puis la description, name...
ou encore Manufacturer, puis la description si je veux classer par compagnies puis nom... etc...
J'ai beau essayé de modifier ton f5.awk, les deux fameuses lignes que tu m'as expliquée au moment de "swapper" description, pas moyen de creer d'autres ordres de tri sans tout casser...
Désolé... :/
dubcek
Messages postés
18755
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
14 novembre 2024
5 621
27 avril 2013 à 09:13
27 avril 2013 à 09:13
à part description= qui s'affiche avant name=, le reste est dans l'ordre trouvé dans le fichier xml. Pour afficher les variables dans un ordre précis, il faudrait tout mettre dans un taleau au fur et à mesure, et afficher à la fin après la balise de fin </game.
donc donne dans quel ordre tu veux les variables
donc donne dans quel ordre tu veux les variables
MAMu_
Messages postés
48
Date d'inscription
mercredi 3 avril 2013
Statut
Membre
Dernière intervention
25 mai 2013
27 avril 2013 à 10:33
27 avril 2013 à 10:33
bah en fait il me faudrait en plus des deux deja (ordre des short name (cad ordre xml), ordre alpha de la description(xml sort)), deux en plus :
un avec les lignes :
year=XXXX&description=AAAAAA&name=....
et l'autre avec les lignes :
Manufacturer=YYYY, year=XXXX, description=AAAAAA...
sur lesquels je ferais des sorts...
un avec les lignes :
year=XXXX&description=AAAAAA&name=....
et l'autre avec les lignes :
Manufacturer=YYYY, year=XXXX, description=AAAAAA...
sur lesquels je ferais des sorts...