Eu prefiro usar um script Bash e um documento aqui para conter o snippet do Gnuplot, diretamente fornecido para gnuplot
. Você não quer realmente usar X_*
para as entradas e X_*.png
para as saídas, porque o primeiro inclui o último - ou seja, se você executar o loop uma segunda vez sem remover os arquivos PNG, você tente usá-los como dados. Então, digamos que nossos arquivos de dados são X_*.out
e desejamos plotá-los para X_*.png
:
#!/bin/bash
export LANG=C LC_ALL=C
for data in X_*.out ; do
[ -r "$data" ] || continue
png="${data%.*}.png"
gnuplot <<END-OF-PLOT
set term png enhanced size 1024,512
set output "$png"
set title "$data"
plot "$data" u 1:2 notitle w lines
END-OF-PLOT
done
A linha export LANG=C LC_ALL=C
define o código do idioma padrão C / POSIX. Isso apenas garante que, se alguém disser que seu professor / professor / TA executa o mesmo script, mas usar um idioma diferente (e preferir um local diferente do seu), ele ainda irá regenerar os mesmos gráficos.
(O problema é que algumas localidades usam .
como pontos decimais, outras usam ,
. Evito essa ambigüidade alternando para a localidade C / POSIX, que está sempre disponível. E usa .
como ponto decimal.)
Se não houver arquivos correspondentes ao padrão de glob X_*.out
, por padrão, o Bash fará uma iteração sobre o corpo do loop com data
tendo o valor X_*.out
em si. O teste [ -r "$data" ] || continue
verifica se existe um arquivo legível chamado na variável data
. Se não, ele pula para a próxima iteração (o resto do corpo do loop não é executado para este valor).
Observe a atribuição png
: ${data%.*}
avalia o valor da variável data
- aqui o nome do arquivo de dados -, exceto que tudo a partir do último .
foi removido. (Se não houver .
em data
, nada será removido.)
Assim, no Bash, ${data%.*}.png
avalia o valor de data
, exceto que, se tiver um sufixo de nome de arquivo, ele será substituído por .png
. Se não houver um sufixo de nome de arquivo, .png
será anexado a ele.
O <<END-MARKER
é usado para iniciar o documento aqui no Bash. O conteúdo, até (mas não incluindo) uma linha que começa com END-MARKER
, é fornecido como entrada. No entanto, a expansão das variáveis é feita dentro desse texto, portanto, você pode usar a sintaxe $variable
ou ${variable}
(e outras) no documento here, e elas serão substituídas pelo conteúdo.
Observe que, diferentemente dos comandos de linha de comando do Bash, as citações em documentos do Bash aqui são mantidas. Portanto, se png
tiver valor X_001.out
, então set output "$png"
expandirá para e o Gnuplot verá como set output "X_001.out"
.