有没有办法在gnuplot中使用通配符?

时间:2014-11-27 15:18:30

标签: regex gnuplot wildcard

我有多个文件命名为以下示例:blast_ sample1 _454LargeContigs.fna.fas_vs_ NC_016593 _filter.txt

更换部件是"样品#" (样本)和" NC _#" (参考),它们是粗体。 每个参考文献有35个样本。 我编写了以下命令,使用35个样本的数据生成参考NC_016593的图:

filename(n) = sprintf("blast_sample%d_454LargeContigs.fna.fas_vs_NC_016593_filter.txt", n)
plot for [i=01:35] filename(i) using 9:3:($10-$9):($3-$3) with vectors nohead

对于每个参考我想做一个情节,因此为此我想用通配符编写一般命令。有没有办法直接在gnuplot中做到这一点?是否可以仅修改" NC _#"部分使用外卡(如shell脚本中的*,类似于NC _ *)?

感谢。

1 个答案:

答案 0 :(得分:8)

这在gnuplot中不可能直接实现。但是,您可以使用系统调用来获取要绘制的文件列表:

filelist=system("ls *.csv")
plot for [filename in filelist] filename using 1:2

因此,这是一个示例,它为每个样本编号创建一个包含所有引用的图:

do for [i=1:35] { 
    cmd = sprintf("ls blast_sample%d_454LargeContigs.fna.fas_vs_NC_*_filter.txt", i)
    filelist=system(cmd)
    plot for [filename in filelist] filename using ...
}

如果每个参考包含所有样本的一个绘图,如果参考编号不是一个简单的系列,则会变得更加困难。如果您想在一个大图中绘制所有内容,可以使用

ls blast_sample*_454LargeContigs.fna.fas_vs_NC_*_filter.txt

(这是Linux。对于Windows,您需要dir \B ...


修改 这个问题和答案差不多有三年了,在最近的评论出现之前,我没有注意到评论中的其他问题。

不清楚输出名称的含义。文件名?每条曲线的标签?情节标题?

一般来说,你可以做到

set terminal pdfcairo
do for [i=1:35] { 
    cmd = sprintf("ls blast_sample%d_454LargeContigs.fna.fas_vs_NC_*_filter.txt", i)
    filelist=system(cmd)
    set output sprintf("Sample_%d.pdf", i)

    title= sprintf("This is the title for plot %d", i)
    plot for [filename in filelist] filename using ... title sprintf("This data comes from %s", filename)
}
unset output

任何返回字符串的函数都可用于构建字符串。

虽然样本编号称为数字,但如果您希望使用此编号,则提取参考编号(" NC")之后会更加棘手。 Gnuplot有一些rudimentary string functions,可能允许这样做。

如果参考号的长度始终相同,我会substr(filename,strlen(filename)-a,strlen(filename)-b)使用ab的正确值来提取此号码。

如果没有,我会使用substr从参考编号开始获取字符串(可以计算位置),然后使用{{1}搜索_的第一次出现然后将字符串剪切到此位置。将此任务传递给外部命令行程序可能更容易。 Linux strstrt可以轻松完成工作。