绘制多个文件以产生多个输出

Plot multiple files to produce multiple outputs

我有一系列文件(在同一目录中),其中包含简单的 2 列数据,所有文件都命名为 file-%d,其中 %d 是当前日期(因此 file-20200721、file-20200720 等),我想通过一个脚本绘制所有这些并获得与输入文件同名的 png 输出 (file-20200721.png).

到目前为止我一直在尝试这个:

set term pngcairo enhanced size 1024, 768
set xdata time
set timefmt "%H:%M:%S"
set xrange ["00:00:00":"23:59:59"]
set format x "%H:%M:%S"
set grid
do for [i=20200101:21000101] {
    fname_in = sprintf("file-%d.log",i)
    fname_out = sprintf("file-%d.png",i)
    set output fname_out
    splot fname_in u 1:2
}
set output

但它根本没有设置正确的输出(只有一个输出,不正确的文件名,也不是真正的 png)。

欢迎任何帮助。

您确定要从 20200101 循环到 21000101 并检查 800'000 个可能的文件名吗? 也许你的意思是 20210101?无论如何,我不知道 gnuplot 有一个 file_exist() 函数。 为此,我想你必须去操作系统级别。

您可以执行系统调用(检查 help system)并获取符合您的命名约定的文件列表。 我想路径和文件不应该包含空格(否则你必须将列表项放在引号中)。

代码:

### loop files in a directory and plot to PNG
reset session
set term pngcairo

myPathWindows = 'C:\user\data\file-*.log'      # for Windows
LIST = system('dir /b "'.myPathWindows.'"')

# myPathLinux = 'C:/user/data/file-*.log'      # for Linux
# LIST = system('ls "'.myPathLinux.'"')

do for [FILE in LIST] {
    set output FILE[1:strlen(FILE)-4].".png"    # take input filename and change extension to ".png"
    plot FILE u 1:2 
}
set output
### end of code

Linux 在尝试绘制文件之前测试文件是否存在的循环版本。

do for [i=20200101:20200111] {
    fname_in = sprintf("file-%d.log",i)
    fname_out = sprintf("file-%d.png",i)
    test_command = "if [ -e " . fname_in . " ]; then echo 'exists'; fi"
    if (system(test_command) ne "exists") {
       print "Missing file: ", fname_in
       continue
    }
    set output fname_out
    splot fname_in u 1:2
}
set output