web-dev-qa-db-fra.com

gnuplot stdin, comment tracer deux lignes?

J'essaie de produire un tracé avec deux lignes en utilisant des données extraites de stdin. J'ai un fichier "test.csv":

0,1.1,2
1,2,3
2,6,4
4,4.6,5
5,5,6

J'ai essayé de tracer cela avec des commandes telles que,

$ cat test | gnuplot -p -e "set datafile separator \",\"; plot '-' using 1:2 with lines, '' using 1:3 with lines;"

Mais peu importe ce que j'essaye je reçois,

line 5: warning: Skipping data file with no valid points

Je suppose que c'est parce que pour la deuxième ligne, stdin a déjà été épuisé. Existe-t-il un moyen de faire en sorte que gnuplot récupère les données de chaque colonne de stdin pour différentes parcelles?

Merci.

26
Steve

Le "-" est utilisé pour spécifier que les données suivent la commande de tracé. Donc, si vous l'utilisez, vous devrez faire quelque chose comme:

echo "set datafile separator \",\"; plot '-' using 1:2 with lines, '' using 1:3 with lines;" | cat - datafile.dat | gnuplot -p

(Citer ci-dessus a probablement besoin d'être échappé).

Qu'est-ce que vous cherchez est ceci:

plot '< cat -'

Maintenant, vous pouvez faire:

cat test | sed ... | gnuplot -p "plot '< cat -' using ..."

Notez que vous devrez peut-être alimenter les données d'entrée via stdin plusieurs fois si vous utilisez des options avec un tracé, comme ceci:

cat testfile testfile | gnuplot -p "plot '< cat -' using 1, '' using 2"

Dans le cas ci-dessus, testfile doit se terminer par une ligne comportant le seul caractère "e".

Référence du manuel

14
PonyEars

J'ai réussi à contourner ce problème en envoyant les données deux fois, terminées par un "e" sur sa propre ligne après chaque bloc. Votre saisie devrait donc ressembler à 

set datafile separator ","; plot '-' using 1:2 with lines, '' using 1:3 with lines
0,1.1,2
1,2,3
2,6,4
4,4.6,5
5,5,6
e
0,1.1,2
1,2,3
2,6,4
4,4.6,5
5,5,6
e
10
bdew

Gnuplot peut lire à partir de stdin, mais pour chaque instruction de tracé, un nouvel ensemble de données est requis. Ce qui suit fonctionne bien:

cat test.csv | gnuplot -p -e "set datafile separator ','; plot '-' using 1:2 w l"

L'erreur apparaît dès que vous ajoutez la deuxième commande de tracé avec , '' using 1:3. Pour cela, vous devez renvoyer les données car le premier jeu de données n'est pas stocké de manière interne pour pouvoir être réutilisé. Donc, pour vous deux commandes de tracé, l'extrait suivant fonctionne bien:

echo 'e' | cat test.csv - test.csv | gnuplot -p -e "set datafile separator ','; plot '-' using 1:2 w l, '' using 1:3 w l"

Cela écrit le fichier de données deux fois, séparé par une e qui indique la fin des données pour la première commande de tracé.

7
Christoph

J'essaierais de convertir le fichier csv en un espace séparé (en supposant qu'aucun des enregistrements ne couvre plusieurs lignes) en le parcourant via sed au lieu de définir le séparateur:

cat test | sed 's/,/ /g' | gnuplot -p -e "plot '-' using ..."
2
arnsholt

C'est peut-être une vieille question mais j'ai trouvé une solution intéressante basée sur les autres réponses:

cat filename | awk -- '{print $0} END{print "e"}' | tee -i -a - -

La sortie serait:

"contents of filename"
e
"contents of filename"
e
"contents of filename"
e

Maintenant, cat et awk fonctionnent comme d'habitude, l'utilitaire tee permet quant à lui de copier la sortie standard acheminée depuis la commande précédente vers un fichier, mais ce fichier peut être stdin afin que nous puissions en faire plusieurs copies. en spécifiant n fois - après -a.

L'option -i cesse d'être interrompue par des signaux lors de la copie. -a lui dit d'ajouter l'entrée à l'entrée standard sans écraser, puis d'écrire le tout dans - stdout .

Pour référence jeter un oeil à Tee Utility

1
robotik

Je devais faire ce qui suit, car ajouter «-» ne fonctionnait pas pour moi:

 cat filename | awk -- '{print $0} END{print "e"}' | tee -i -a /dev/stdout /dev/stdout 
0
LEo

Avez-vous essayé chart ? Votre cas serait aussi simple que:

cat test | chart line ','

Et vous donnerais:

 line chart

0
mlg

Pour moi cela fonctionne quand je fais:

set datafile separator ','
plot "test.csv" using 1:2 with lines

il semble que vous ayez utilisé "," pour séparateur de fichier au lieu de ','

0
Martin

gnuplot semble avoir besoin d’un accès aléatoire (c’est-à-dire pas de stdin), alors je pense que vous êtes coincé avec 

# explicitly open "test" file
$ gnuplot -p -e "set datafile separator \",\"; plot 'test' using 1:2 with lines, '' using 1:3 with lines;"
0
Rhythmic Fistman