#1 Le 02/10/2019, à 16:08
- soupaloignon
[Réglé] Fractionner un fichier, traitements avec awk et sed
Bonjour à tous,
Je suis en train de travailler sur un script traitant des données en colonnes. J'avais besoin de rajouter des colonnes à des endroits précis, ça c'est ok.
je me retrouve maintenant avec un fichier de 200 lignes environ, comportant 10 colonnes.
je voudrais faire un tri sur la 1ere colonne, qui peut avoir 6 valeurs :
6-1 6-2 6-3 6-4 6-5 6-6
chacune de ses valeurs comporte environ 30/35 lignes
je voudrais donc, à partir du fichier principal qui comporte toutes les lignes, créer 6 fichiers.
chacun de ces fichiers comportant toutes les lignes correspondant à la valeur de la 1ere colonne
un exemple simple avec moins de colonne et de valeurs :
fichier principal :
6-1;info1;info2;info3
6-1;info4;info5;info6
6-1;info7;info8;info9
6-2;info10;info11;info12
6-2;info13;info14;info15
6-2;info16;info17;info18
une fois la commande passée cela donnerait 2 fichiers. le 1er fichier s’appelle 6-1.txt et contient :
6-1;info1;info2;info3
6-1;info4;info5;info6
6-1;info7;info8;info9
et le 2eme fichier s'appelle 6-2.txt et contient
6-2;info10;info11;info12
6-2;info13;info14;info15
6-2;info16;info17;info18
et bien évidemment c'est sur ce point que je bute. Auriez vous des infos, des idées, des pistes ?
Dernière modification par soupaloignon (Le 04/10/2019, à 15:17)
==> Libérez les huitres du bassin d'Arcachon <==
Hors ligne
#2 Le 02/10/2019, à 16:16
- Postmortem
Re : [Réglé] Fractionner un fichier, traitements avec awk et sed
Bonjour,
awk -F \; '{ print > $1 ".txt" }' "fichier principal"
Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »
Hors ligne
#3 Le 02/10/2019, à 16:26
- soupaloignon
Re : [Réglé] Fractionner un fichier, traitements avec awk et sed
Respect Postmortem, ça fonctionne génialement bien
==> Libérez les huitres du bassin d'Arcachon <==
Hors ligne
#4 Le 02/10/2019, à 17:10
- Postmortem
Re : [Réglé] Fractionner un fichier, traitements avec awk et sed
awk c'est génial !
Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »
Hors ligne
#5 Le 02/10/2019, à 17:38
- soupaloignon
Re : [Réglé] Fractionner un fichier, traitements avec awk et sed
Carrément oui, je m'y étais jamais trop frotté jusqu'à présent (pas vraiment de temps, pas de besoin surtout), mais là je suis en train de travailler sur de la modif de fichier (la solution que tu m'as amené est une partie du traitement) et j'ai trouvé sur le net, pour d'autres traitements, 2 lignes de commande avec awk qui sont une tuerie.
à la base je travaille sur un fichier csv. la commande en question me permet de rajouter des colonnes, les placer ensuite où je veux dans la ligne, et me permet même de concaténer des champs. un truc de fou.
la 1ere commande avec awk permet de rajouter des nouvelles colonnes à la fin du fichier :
awk '{print $0";==FRANCAIS==;==MATHS==;;"}' 01.csv > 02.txt
la 2eme commande pour ensuite réorganiser l'ordre des colonnes, et en concaténer certaines
cat 02.txt | awk -F";" '{print $1$2$3$4 ";" $5 "-" $6 ";" $11 ";" $7 ";" $8 ";" $12 ";" $9 ";" $10 ";" $13 ";" ";"}' > 03.txt
j'ai trouvé ça ici : http://patatos.over-blog.com/article-co … 34990.html
bon, je laisse pas ces infos pour toi PostMortem , mais si cela sert à d'autres ...
Dernière modification par soupaloignon (Le 02/10/2019, à 18:04)
==> Libérez les huitres du bassin d'Arcachon <==
Hors ligne
#6 Le 02/10/2019, à 17:44
- soupaloignon
Re : [Réglé] Fractionner un fichier, traitements avec awk et sed
Bonjour à tous,
J'ai une commande sed
sed "s+;+\n+g" 6-6-g2.txt > 6-6-g2-FINAL.txt
avec la quelle je peux traiter mes fichiers 1 à 1
j'aimerai pouvoir lancer cette commande dans une boucle qui passerait sur tous les fichiers (12 fichiers contenant chacun 20 lignes environ) et que les fichiers modifiés gardent le même nom que les fichiers natifs
Merci d'avance pour vos idées, piste ou solutions
==> Libérez les huitres du bassin d'Arcachon <==
Hors ligne
#7 Le 02/10/2019, à 17:46
- Watael
Re : [Réglé] Fractionner un fichier, traitements avec awk et sed
salut,
options -s et -i.
NB: le -s n'est peut-être pas indispensable.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#8 Le 02/10/2019, à 18:03
- soupaloignon
Re : [Réglé] Fractionner un fichier, traitements avec awk et sed
Merci Watael pour ta réponse ... mais qu'est ce que j'en fais ?
==> Libérez les huitres du bassin d'Arcachon <==
Hors ligne
#9 Le 02/10/2019, à 18:08
- kamaris
Re : [Réglé] Fractionner un fichier, traitements avec awk et sed
Si ce fil est bien la suite de celui-ci : https://forum.ubuntu-fr.org/viewtopic.php?pid=22157270, alors tu aurais pu tout faire dans awk, par
awk -F \; -v OFS=$'\n' '{ NF=NF; print > $1 ".txt" }' "fichier principal"
Hors ligne
#10 Le 02/10/2019, à 18:14
- soupaloignon
Re : [Réglé] Fractionner un fichier, traitements avec awk et sed
Bonsoir kamaris,
oui, ce fil est bien la suite du fil que tu cites .
Merci pour la ligne de commande, le problème c'est qu'en fait je ne la comprends pas, et si je veux faire par la suite des modifs, je ne saurai jamais comment faire. Alors que si je travaille par bloc de commandes, cela me parle beaucoup plus pour des modifs, même si ce n'est pas académique.
Je vais tester ta ligne de commande bien sur, pour le fun et parce que tu y as consacré du temps; ce pourquoi je te remercie.
Mais si tu as dans tes cartons juste une boucle avec la ligne
sed "s+;+\n+g"
je prends
==> Libérez les huitres du bassin d'Arcachon <==
Hors ligne
#11 Le 02/10/2019, à 18:19
- soupaloignon
Re : [Réglé] Fractionner un fichier, traitements avec awk et sed
oh la vache, ça marche super bien ta ligne
Mais je reste quand même sur ce que j'ai écris dans le précédent post, pour les raisons évoquées
Merci encore à toi, belle ligne
==> Libérez les huitres du bassin d'Arcachon <==
Hors ligne
#12 Le 02/10/2019, à 18:32
- kamaris
Re : [Réglé] Fractionner un fichier, traitements avec awk et sed
Pour la commande awk, voici ce que j'ai rajouté à celle de Postmortem et les explications :
-v OFS=$'\n'
Avec ça, on force l'OFS (output field separator) à être égal au caractère newline avant toute opération.
NF=NF;
Avec ça, on force à chaque ligne le recalcul de ce qui va être affiché en sortie, en prenant en compte l'OFS donné précédemment, ce qui est l'équivalent de ta commande sed.
Pour la boucle, de ce que j'ai compris, c'est tout simple :
for f in *.txt; do sed -i 's+;+\n+g' "$f"; done
Il te faudra peut-être simplement adapter le chemin et / ou le pattern à la place de « *.txt »
Hors ligne
#13 Le 02/10/2019, à 18:36
- soupaloignon
Re : [Réglé] Fractionner un fichier, traitements avec awk et sed
Merci pour ta réponse kamaris, je me lance avec délectation dans l'exercice de compréhension
==> Libérez les huitres du bassin d'Arcachon <==
Hors ligne
#14 Le 02/10/2019, à 18:48
- soupaloignon
Re : [Réglé] Fractionner un fichier, traitements avec awk et sed
Pour la boucle, de ce que j'ai compris, c'est tout simple :
for f in *.txt; do sed -i 's+;+\n+g' "$f"; done
Il te faudra peut-être simplement adapter le chemin et / ou le pattern à la place de « *.txt »
Génial, ça fonctionne super bien, et au moins je comprend cette ligne et je peux donc l'adapter pour d'autres choses si besoin (pas besoin d'adapter le chemin, je met le script dans le dossier contenant les fichiers à traiter)
bon, il ne me reste plus qu'à poster un nouveau post concernant la manip à appliquer pour que les fichiers créés sous Linux soit compatible windows. Une histoire de marqueur de fin de ligne si j'ai bien tout compris
==> Libérez les huitres du bassin d'Arcachon <==
Hors ligne
#15 Le 02/10/2019, à 18:51
- soupaloignon
Re : [Réglé] Fractionner un fichier, traitements avec awk et sed
Heu ... il y a un modo qui a fusionné les 2 posts ? pourtant même si c'était le même projet, c'était des aspects différents (je dis ça parce qu eje n'ai pas voulu poursuivre le post initial avec la 2eme demande)
je vais modifier le titre du post, pour qu'il refléte au plus prés le contenu
Dernière modification par soupaloignon (Le 02/10/2019, à 18:52)
==> Libérez les huitres du bassin d'Arcachon <==
Hors ligne
#16 Le 02/10/2019, à 18:54
- kamaris
Re : [Réglé] Fractionner un fichier, traitements avec awk et sed
Pour les fins de ligne windows, pas besoin d'un nouveau fil je pense, il risque d'être à nouveau fusionné avec celui-ci.
Pour faire ça, c'est la commande dos2unix (ou sa commande sœur unix2dos en l'occurrence).
Sinon, pour inclure ça dans le traitement awk ci-dessus, c'est
awk -F \; -v OFS=$'\r\n' -v ORS=$'\r\n' '{ NF=NF; print > $1 ".txt" }' "fichier principal"
Dernière modification par kamaris (Le 02/10/2019, à 19:07)
Hors ligne
#17 Le 02/10/2019, à 19:12
- soupaloignon
Re : [Réglé] Fractionner un fichier, traitements avec awk et sed
Merci pour ta réponse kamaris, et si je veux le dissocier du reste ? pour rester dans l'esprit de ce que j'évoquais dans les précédents posts
edit : j'avais commencé des recherches pour cette histoire de fin de ligne, et ce que tu cites (dos2unix (ou sa commande sœur unix2dos en l'occurrence) était fréquemment revenu
Dernière modification par soupaloignon (Le 02/10/2019, à 19:16)
==> Libérez les huitres du bassin d'Arcachon <==
Hors ligne
#18 Le 02/10/2019, à 19:17
- kamaris
Re : [Réglé] Fractionner un fichier, traitements avec awk et sed
Pour ça c'est la commande unix2dos comme je te disais : https://linux.die.net/man/1/unix2dos
Pour convertir tous tes fichiers sur place, ça doit être
unix2dos *.txt
Hors ligne
#19 Le 02/10/2019, à 19:26
- soupaloignon
Re : [Réglé] Fractionner un fichier, traitements avec awk et sed
Yes, merci pour l'info. Je testerai ça demain au boulot, parce que on a 3 ordis à la maison, mais il n'y a que du Linux
==> Libérez les huitres du bassin d'Arcachon <==
Hors ligne
#20 Le 02/10/2019, à 19:30
- kamaris
Re : [Réglé] Fractionner un fichier, traitements avec awk et sed
Une remarque supplémentaire : comme le suggérait Watael en #7, tu n'as pas besoin de la boucle for pour appliquer la modification avec sed :
sed -i 's+;+\n+g' *.txt
modifiera tous tes fichiers sur place.
Bien sûr, il faut là encore modifier le « *.txt » si besoin.
Hors ligne
#21 Le 02/10/2019, à 19:46
- soupaloignon
Re : [Réglé] Fractionner un fichier, traitements avec awk et sed
Ah ok, merci pour l'info, qui éclaire le post de Watael que je n'avais pas compris sur le moment
==> Libérez les huitres du bassin d'Arcachon <==
Hors ligne
#22 Le 04/10/2019, à 08:14
- soupaloignon
Re : [Réglé] Fractionner un fichier, traitements avec awk et sed
Bonjour le forum,
Je me suis aperçu, suite à une erreur que j'ai fait, qu'avant de lancer ce script sur le fichier csv, il fallait avant faire un contrôle de cohérence.
les colonnes 3 et 4 ne peuvent contenir qu'une valeur. Soit dans la 3, soit dans la 4.
Comment faire pour vérifier que c'est bien le cas ? (une erreur pourrait être qu'il y a une valeur dans la 3, et une autre dans la 4, ou bien qu'il n'y ait aucune valeur dans la 3 et la 4)
Idéalement si aucune incohérence n'est détectée le script se lance. Si 1 ou plusieurs incohérences sont détectées il y a une fenêtre zenity qui apparaît, indiquant qu'il y a erreur et invite a revoir le fichier dans un tableur
le fichier csv, à ce stade du traitement, se présente ainsi :
6-1;-;g1;;NOM11;Prenom11;idFRANCAIS11;MdpFRANCAIS11;idMATHS11;MdpMATHS11
6-1;-;g1;;NOM12;Prenom12;idFRANCAIS12;MdpFRANCAIS12;idMATHS12;MdpMATHS12
6-1;-;g1;;NOM13;Prenom13;idFRANCAIS13;MdpFRANCAIS13;idMATHS13;MdpMATHS13
6-1;-;g1;;NOM14;Prenom14;idFRANCAIS14;MdpFRANCAIS14;idMATHS14;MdpMATHS14
6-1;-;g1;;NOM15;Prenom15;idFRANCAIS15;MdpFRANCAIS15;idMATHS15;MdpMATHS15
6-1;-;;g2;NOM16;Prenom16;idFRANCAIS16;MdpFRANCAIS16;idMATHS16;MdpMATHS16
6-1;-;;g2;NOM17;Prenom17;idFRANCAIS17;MdpFRANCAIS17;idMATHS17;MdpMATHS17
6-1;-;;g2;NOM18;Prenom18;idFRANCAIS18;MdpFRANCAIS18;idMATHS18;MdpMATHS18
6-1;-;;g2;NOM19;Prenom19;idFRANCAIS19;MdpFRANCAIS19;idMATHS19;MdpMATHS19
6-1;-;;g2;NOM20;Prenom20;idFRANCAIS20;MdpFRANCAIS20;idMATHS20;MdpMATHS20
Merci d'avance pour vos idées, pistes, solutions
Dernière modification par soupaloignon (Le 04/10/2019, à 08:22)
==> Libérez les huitres du bassin d'Arcachon <==
Hors ligne
#23 Le 04/10/2019, à 08:55
- pingouinux
Re : [Réglé] Fractionner un fichier, traitements avec awk et sed
Bonjour,
Cette commande te listera les lignes du fichier ne respectant pas le critère :
awk -F";" '{n=0;if($3)n+=1; if($4)n+=1; if(n!=1)printf("ligne n° %3d => %s\n",NR,$0)}' fichier.csv
Ajouté : Autre façon de faire
if awk -F";" '{n=0;if($3)n+=1; if($4)n+=1; if(n!=1)exit 1}' fichier.csv
then
: # Traitement si le fichier est correct
else
: # Traitement si le fichier est erroné
fi
Dernière modification par pingouinux (Le 04/10/2019, à 09:31)
Hors ligne
#24 Le 04/10/2019, à 10:32
- soupaloignon
Re : [Réglé] Fractionner un fichier, traitements avec awk et sed
Merci pingouinux, impérial comme à ton habitude les 2 versions marchent très bien
J'ai essayé de mixer les 2, et de faire un affichage des erreurs dans le else quand il y en a, avec pour objectif final d'afficher les erreurs dans une fenetre zenity
J'ai tenté ça, mais sans résultat
if awk -F";" '{n=0;if($3)n+=1; if($4)n+=1; if(n!=1)exit 1}' 01.csv
then
echo Traitement si le fichier est correct
else
printf("ligne n° %3d => %s\n",NR,$0)
fi
==> Libérez les huitres du bassin d'Arcachon <==
Hors ligne
#25 Le 04/10/2019, à 10:46
- pingouinux
Re : [Réglé] Fractionner un fichier, traitements avec awk et sed
if awk -F";" '{n=0;if($3)n+=1; if($4)n+=1; if(n!=1){printf("ligne n° %3d => %s\n",NR,$0);err=1}}END{exit err}' fichier.csv
then
echo "fichier correct"
else
echo "fichier erroné"
fi
Hors ligne