2 votes

Scripting avec gnuplot--où sed

Je cherche donc une solution rapide et simple.

Le problème :

J'essaie de tracer une section spécifique d'un fichier de données avec gnuplot. Cela fonctionne bien. La ligne de base ressemble à quelque chose comme

plot "<(sed -n '1,100p' pointsandstuff.dat)" u 1:log($4**2+$5**2) notitle

Cela fonctionne très bien. L'étape suivante que je veux est d'inclure dans mon titre une autre partie des données, à savoir la saisie des données 3$ (qui pour les points listés est identique, donc je peux l'analyser de n'importe où). Je me heurte à un problème car, bien que le tracé semble correct, je ne parviens pas à introduire des informations regex dans le "titre". Un exemple de quelque chose qui n'a pas travail"

plot "<(sed -n '1,100p' pointsandstuff.dat)" u 1:log($4**2+$5**2) title "<(sed -n '1,1p' pointsandstuff.dat)"

(En théorie, cela devrait produire une ligne de données complète, mais en pratique, je n'obtiens que le titre "<(sed...").

J'ai essayé d'attaquer cela avec un script bash, mais les '$' que j'utilise mettent le script bash dans tous ses états :

#!/bin/bash

STRING=$(echo|sed -n '25001,25001p' pointsandstuff.dat)
echo $STRING

 gnuplot -persist << EOF
 set xrange[:] noreverse nowriteback
 set yrange[:] noreverse nowriteback

 eval "plot "<(sed -n '25001,30000p' pointsandstuff.dat)" u 1:log($4**2+$5**2) title $STRING

EOF

Bash ne saura pas quoi faire de "4" et "5".

2voto

Jonathan Leffler Points 299946

Vous semblez tenter une substitution de processus, mais les doubles guillemets empêchent le processus de fonctionner dans le premier cas et vous avez besoin d'une substitution de commande dans le second cas.

Vous avez :

plot "<(sed -n '1,100p' pointsandstuff.dat)" u 1:log($4**2+$5**2) \
      title "<(sed -n '1,1p' pointsandstuff.dat)"

Vous avez besoin :

plot <(sed -n '1,100p' pointsandstuff.dat) u 1:log($4**2+$5**2) \
      title "$(sed -n '1,1p' pointsandstuff.dat)"

Les guillemets dans le second cas ne sont peut-être pas strictement nécessaires, mais vous ne vous tromperez pas s'ils sont présents.

  • La substitution de processus génère un nom de fichier et alimente la sortie de la commande imbriquée dans ce fichier ; la commande pense qu'elle lit un fichier (parce qu'elle lit un fichier).

  • La substitution de commande capture la sortie de la commande imbriquée dans une chaîne et passe cette chaîne à la commande (lorsqu'elle est utilisée comme argument d'une commande, comme ici).

1voto

mgilson Points 92954

Ma compréhension de la question est un peu floue, mais il semble que vous vouliez tracer les 100 premières lignes -- C'est assez facile à faire :

plot '< head -100 datafile.dat' u  ....

Bien sûr, vous pouvez utiliser sed si vous le souhaitez (ou awk ou ...). Une solution uniquement gnuplot pourrait ressembler à ceci :

plot 'datafile.dat' u ($0 > 100? 1/0:$1):(log($4**2+$5**2))

Ou comme ceci (qui est plus simple pour les sélections régulières) :

plot 'datafile.dat' every ::25001::30000 u 1:(log($4**2+$5**2)

et expliqué plus en détail dans une autre réponse .

Maintenant, si vous voulez que le titre provienne du fichier de données, vous pouvez l'analyser à l'aide de l'outil de gnuplot backtic substitution :

plot ... title "`head -1 datafile.dat | awk '{print $3}'`"

qui est essentiellement la même que la commande système de gnuplot :

plot ... title system("head -1 datafile.dat | awk '{print $3}'")

mais dans ce cas, vous puede être en mesure d'utiliser le columnhead fonction :

plot ... title columnhead(3)

0voto

Samuel Markson Points 32

Aha, merci à tous. J'ai trouvé quelques solutions maintenant - la plus simple étant d'échapper les $s d'avant (que je pensais à tort que gnuplot n'aimait pas...). A la blanche :

STRING=$(echo|sed -n '1,1p' spointsandstuff.dat)
echo $STRING

 gnuplot -persist << EOF
 set xrange[:] noreverse nowriteback
 set yrange[:] noreverse nowriteback

 eval "plot "<(sed -n '1,100p' pointsandstuff.dat)" u 1:(log(\$4**2+\$5**2)) title '$STRING'
 !gv diag_spec.eps &

EOF

Merci à tous, cependant - cela a été une bonne excuse pour jouer avec ce genre de choses... en espérant que, si une pauvre âme voit ce script plus tard, cela pourrait être un peu plus facile pour elle.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X