web-dev-qa-db-fra.com

Gnuplot: le moyen le plus court d'ignorer la première ligne du fichier de données

J'ai un fichier de données .csv créé par une autre application tierce qui doit être tracé à l'aide de gnuplot. Supposons que le fichier ait le format suivant:

1;2;3;4;5;6 <-- This is the header line that should be ignored (with values 1;2;...;N)
1;1;2;1;1;1
2;3;3;3;5;6
3;4;1;1;1;4

La première colonne est l'axe des x, les colonnes suivantes doivent chacune être tracées en tant que propre tracé de ligne (oui, je sais, trop de tracés de ligne dans un tracé peuvent sembler mauvais, mais juste pour avoir une idée). Voici un MCVE:

set terminal png size 1000,500    
set datafile separator ";" # CSV file is seperated with ;
plot \
  'C://tmp/test.csv' using 1:2 with lines title "A",\
  'C://tmp/test.csv' using 1:3 with lines title "B",\
  'C://tmp/test.csv' using 1:4 with lines title "C",\
  'C://tmp/test.csv' using 1:5 with lines title "D",\
  'C://tmp/test.csv' using 1:6 with lines title "E"

Le problème est que cela trace également la première ligne comme s'il s'agissait de données.

Je sais que pour ignorer n'importe quelle ligne du fichier de données en la commençant par #, comme #1;2;3;4;5;6, mais je ne souhaite pas modifier le fichier, car il est également utilisé par d'autres outils.

Une autre façon consiste à utiliser plot <filename> every ::1 pour ignorer la première ligne, ce qui signifierait que je devrais inclure every ::1 5 fois dans le script ci-dessus, comme expliqué dans ce lien . Cela ressemblerait à ceci:

set terminal png size 1000,500    
set datafile separator ";" # CSV file is seperated with ;
plot \
  'C://tmp/test.csv' every ::1 using 1:2 with lines title "A",\
  'C://tmp/test.csv' every ::1 using 1:3 with lines title "B",\
  'C://tmp/test.csv' every ::1 using 1:4 with lines title "C",\
  'C://tmp/test.csv' every ::1 using 1:5 with lines title "D",\
  'C://tmp/test.csv' every ::1 using 1:6 with lines title "E"

Définit every ::1 pour chaque intrigue vraiment le seul moyen? Existe-t-il une façon plus courte - préférable pour une ligne - d'ignorer la (les) première (s) ligne (s); un moyen de définir le every ::1 "globalement" ou quelque chose comme (pseudocode) set datafile ignorefirstnlines 1?

15
Markus Weninger

Gnuplot peut lire les noms de colonnes à partir de la première ligne, mais vous pouvez également spécifier les noms de colonnes normalement également. Par conséquent, cela saute effectivement la première ligne.

Émettez la commande

set key autotitle columnhead

Cela indique à gnuplot que la première ligne n'est pas des données, mais est le nom des colonnes à utiliser pour la clé. Vous pouvez toujours unset key Ou plot datafile title sometitle Comme avant, et gnuplot n'utilisera tout simplement pas ces données.

Supposons que mon fichier ressemble à

1 2
4 5
7 8

Je peux simplement émettre set key autotitle columnhead Suivi de unset key (Si je ne veux pas vraiment de clé), et cela sautera la première ligne.

enter image description here


Alternativement, je peux diriger mes données via un programme externe. Par exemple, en utilisant awk (qui est disponible pour la plupart des OS, y compris Windows), je peux faire

plot "< awk '(NR>2){print;}' datafile"

pour sauter les 2 premières lignes (sous Windows, je dois faire '< awk "(NR>2){print;}" datafile'). Si je ne veux pas continuer à taper ceci, je peux le stocker dans une chaîne

skipfile = "\"< awk '(NR>2){print;}' datafile\""

et utilisez-le comme macro (pour Windows, utilisez skipfile = '"< awk \"(NR>2){print;}\" datafile"'). Par exemple, pour tracer le fichier de données en utilisant des lignes, je pourrais faire

plot @skipfile with lines

Le @skipfile Indique simplement à gnuplot de traiter la commande comme si je venais de taper le contenu de skipfile juste là.

30
Matthew