Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 02/10/2019, à 17: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 ?
smile

Dernière modification par soupaloignon (Le 04/10/2019, à 16:17)


==> Libérez les huitres du bassin d'Arcachon <==

Hors ligne

#2 Le 02/10/2019, à 17: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, à 17:26

soupaloignon

Re : [Réglé] Fractionner un fichier, traitements avec awk et sed

Respect Postmortem, ça fonctionne génialement bien smile


==> Libérez les huitres du bassin d'Arcachon <==

Hors ligne

#4 Le 02/10/2019, à 18: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, à 18: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 wink, mais si cela sert à d'autres ...

Dernière modification par soupaloignon (Le 02/10/2019, à 19:04)


==> Libérez les huitres du bassin d'Arcachon <==

Hors ligne

#6 Le 02/10/2019, à 18: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 smile


==> Libérez les huitres du bassin d'Arcachon <==

Hors ligne

#7 Le 02/10/2019, à 18: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.

En ligne

#8 Le 02/10/2019, à 19: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 ? big_smile


==> Libérez les huitres du bassin d'Arcachon <==

Hors ligne

#9 Le 02/10/2019, à 19: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, à 19: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 wink.

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 wink


==> Libérez les huitres du bassin d'Arcachon <==

Hors ligne

#11 Le 02/10/2019, à 19:19

soupaloignon

Re : [Réglé] Fractionner un fichier, traitements avec awk et sed

oh la vache, ça marche super bien ta ligne big_smile

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, à 19: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, à 19: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 wink


==> Libérez les huitres du bassin d'Arcachon <==

Hors ligne

#14 Le 02/10/2019, à 19:48

soupaloignon

Re : [Réglé] Fractionner un fichier, traitements avec awk et sed

kamaris a écrit :

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, à 19: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 wink (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, à 19:52)


==> Libérez les huitres du bassin d'Arcachon <==

Hors ligne

#16 Le 02/10/2019, à 19: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, à 20:07)

Hors ligne

#17 Le 02/10/2019, à 20: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, à 20:16)


==> Libérez les huitres du bassin d'Arcachon <==

Hors ligne

#18 Le 02/10/2019, à 20: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, à 20: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 lol


==> Libérez les huitres du bassin d'Arcachon <==

Hors ligne

#20 Le 02/10/2019, à 20: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, à 20: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, à 09: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, à 09:22)


==> Libérez les huitres du bassin d'Arcachon <==

Hors ligne

#23 Le 04/10/2019, à 09: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, à 10:31)

Hors ligne

#24 Le 04/10/2019, à 11:32

soupaloignon

Re : [Réglé] Fractionner un fichier, traitements avec awk et sed

Merci pingouinux, impérial comme à ton habitude smile 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, à 11: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