IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

MPI shell lecture/ecriture fichier


Sujet :

Shell et commandes GNU

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2018
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2018
    Messages : 45
    Par défaut MPI shell lecture/ecriture fichier
    Bonjour,

    Je travail avec un code en c qui simule une vague. Le fichier all-out2.dat correspond aux coordonnées (x,y) de ma vague. Ce fichier est correct.
    Je travail en utilisant MPI car c'est des calculs qui peuvent prendre pas mal de temps.
    Le problème vient du fait que le fichier ligne et lignes ont des valeurs fausses ...
    Pourtant mon code shell me paraît bon ?
    J'ai changer à la main l'extension des fichiers après avoir fait tourner le code car je ne pouvais pas ouvrir du .dat avec le site.
    Si quelqu'un à une idée svp ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    	char names[80];
    	double Xmax = 0., Ymax = 0.;
    	sprintf(names, "outt%d", pid());
    	FILE * fout = fopen (names, "w");
    	output_facets (f,fout);
    	fclose(fout);
    	system("cat outt* > all-out.dat");
    	if(pid() == 0.){
    		system("awk -F ' ' '{ if ($2 >= 1.5) {print ''} else {print $0} }' all-out.dat > all-out2.dat"); // fichier contenant (x,y)
    		system("(cut -f2 all-out2.dat | sort -n -r | head -1) >ligne"); // Je selectionne (x,ymax) dans le fichier all-out2.dat puis jecrit le résultat dans ligne.
    		system("cat ligne >> lignes"); // je fais une copie du fichier ligne dans lignes
    		FILE * fligne = fopen("ligne", "r");
    		rewind(fligne);
    		fscanf(fligne,"%lf %lf", &Xmax, &Ymax);
    		fclose(fligne);
    	}
    	//fprintf(gnuplotPipe, "refresh\n");
    	fprintf (gnuplotPipe, "set output 'plot%d.png'\n", frame);
    	fprintf (gnuplotPipe, "set title 't = %g, Xmax = %lf, Ymax =%lf' font ',25'\n",t, Xmax, Ymax);
    	fprintf (gnuplotPipe, "plot 'all-out2.dat' u 1:2 w l lt rgb'#11BB11' t 'interface',""'lignes' u 1:2 w l t 'Position max crête'\n");
    	fflush (gnuplotPipe);
    	frame++;
    }
     
    event stop (t = EndTime){
      system("ffmpeg -r 25 -f image2 -i plot%d.png -c:v libx264 -vf format=yuv420p -y mov.mp4 && "
    	 "rm -f plot* lignes ligne");
      return 1;
    }
    Je vous en remercie !
    Fichiers attachés Fichiers attachés

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 636
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 636
    Par défaut
    Bonjour,

    ça cat outt* > all-out.dat | awk -F c'est faux.
    tu ne peux pas rediriger le contenu de fichiers vers un autre fichier ET le passer par un pipe à une commande.

    mais, avec autant de shell dans ton code C, tu ne ferais pas mieux d'écrire un script shell ?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2018
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2018
    Messages : 45
    Par défaut
    Bonjour,

    Pardon j'aurais du enlever cette ligne qui est de toute façon commenté dans le code.
    Le problème ne vient pas de ça.
    Et bien j'ai hésité entre écrire en code en c pour trier mes valeurs et faire une sélection ou faire vite fait du shell.
    J'ai choisi le shell car cette opération est plus courte et rapide en shell.

  4. #4
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 636
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 636
    Par défaut
    quand je disais écrire un script shell, je voulais dire TOUT faire dans un shell script, et appeler ce script depuis le code C si le C est indispensable, parce que gnuplot existe en ligne de commande, finalement tu exécutes ffmpeg.

    je ne programme pas du tout en C.
    de mon point de vue non initié, donc, ton code C ressemble à simple wrapper.
    et alors, le C est-il indispensable ?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Membre émérite Avatar de balkany
    Homme Profil pro
    Touriste
    Inscrit en
    Juillet 2017
    Messages
    348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Touriste

    Informations forums :
    Inscription : Juillet 2017
    Messages : 348
    Par défaut
    Oui, il me semble aussi que le C ne sert pas à grand chose ici.
    Sinon, je pense que ton problème vient de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cut -f2 all-out2.dat | sort -n -r | head -1
    Ça serait plutôt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LC_ALL=C sort -nrk2 all-out2.dat | head -1

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2018
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2018
    Messages : 45
    Par défaut
    Oui le c est indispensable et le soucis c'est que je suis pas bon en shell. A mon avis je vais tout faire en c si je ne trouve pas la solution.
    Je dois rendre mon travail pour la semaine prochaine. Malheureusement je n'ai pas énormement de temps devant moi pour m'investir dans un script shell et un wrapper.
    Je vous ai montré qu'une partie du code en c et j'utilise plein de fonction qui sont codées en c.

    A quoi correspond LC_ALL = C ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LC_ALL=C sort -nrk2 all-out2.dat | head -1

  7. #7
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2018
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2018
    Messages : 45
    Par défaut
    OUI ça marche !!!!
    tu es un génie !
    Du coup pourquoi mon shell ne fonctionnait pas ?
    Je me coucherais moins bête.
    MERCI

  8. #8
    Membre émérite Avatar de balkany
    Homme Profil pro
    Touriste
    Inscrit en
    Juillet 2017
    Messages
    348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Touriste

    Informations forums :
    Inscription : Juillet 2017
    Messages : 348
    Par défaut
    Le LC_ALL=C force l'utilisation de la langue anglaise, où le point est le délimiteur des décimales, ce qui permet à sort de trier correctement les nombres, qui sont exprimés dans ce format dans le fichier all-out2.dat.
    Par ailleurs, tu voulais obtenir un couple (x,ymax), et tu commençais par supprimer la colonne des x par un cut (sans toutefois y parvenir, car tu n'utilisais pas le bon délimiteur de champs).
    Donc au final, il faut garder la colonne des x (pas de cut), indiquer à sort que l'on veut trier sur la seconde colonne des y (-k2), au format numérique décroissant (-nr), et avec le bon format de nombres (LC_ALL=C).

  9. #9
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 339
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 339
    Par défaut
    Euh, moi, je vois un autre souci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ echo '1 1.5' | awk -F ' ' '{ if ($2 >= 1.5) {print ''} else {print $0} }'
    1 1.5
    $ echo '1 1.5' | awk -F ' ' '{ if ($2 >= 1.5) {print ""} else {print $0} }'
     
    $
    La première ligne est celle tirée du code C.

  10. #10
    Membre émérite Avatar de balkany
    Homme Profil pro
    Touriste
    Inscrit en
    Juillet 2017
    Messages
    348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Touriste

    Informations forums :
    Inscription : Juillet 2017
    Messages : 348
    Par défaut
    Il se trouve que les données du fichier all-out.dat donné en exemple répondent de toutes façons à ce critère, mais c'est vrai que cette ligne serait probablement à remplacer par
    car je ne vois pas l'intérêt des lignes vides.

  11. #11
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2018
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2018
    Messages : 45
    Par défaut
    Je souhaite supprimer la ligne ou y est >=1.5 car après j'utilise gnuplot et je ne souhaite pas avoir de point au dessus de ce seuil.
    J'effectue d'abord cette selection sur le fichier all-out.dat qui écrit le résultat dans all-out2.dat. C'est pour cela que ce fichier ne contient pas de point y>=1.5

  12. #12
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 339
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 339
    Par défaut
    Citation Envoyé par Suntory Voir le message
    Je ne vois pas pourquoi ?

    1.5 est bien égale à 1.5 du coup je supprime cette ligne.
    Non, tu as un effet de bord à cause des ouvertures/fermetures de simple quotes, c'est comme-ci tu avais écrit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F ' ' '{ if ($2 >= 1.5) {print} else {print $0} }'
    La solution de Balkany est bien mieux et sans effet de bord.

  13. #13
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2018
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2018
    Messages : 45
    Par défaut
    Ah d'accord ...
    Merci beaucoup !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. PL/SQL lecture/ecriture fichier txt
    Par stos dans le forum PL/SQL
    Réponses: 2
    Dernier message: 19/05/2006, 12h19
  2. [lecture/ecriture] fichier excel
    Par ethno dans le forum C
    Réponses: 4
    Dernier message: 14/04/2006, 19h47
  3. php: lecture ecriture fichier
    Par kda007 dans le forum Langage
    Réponses: 2
    Dernier message: 07/02/2006, 18h49
  4. [AS2] Lecture Ecriture Fichier Texte
    Par cpr0 dans le forum ActionScript 1 & ActionScript 2
    Réponses: 4
    Dernier message: 13/09/2005, 11h22
  5. [LG]Lecture-ecriture fichier
    Par arno15 dans le forum Langage
    Réponses: 19
    Dernier message: 03/02/2005, 22h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo