【问题标题】:Use awk to set the title of a data series in gnuplot, based on the filename使用 awk 根据文件名在 gnuplot 中设置数据系列的标题
【发布时间】:2014-11-05 00:55:56
【问题描述】:

我正在尝试使用 gnuplot 来比较几个数据文件。我使用ls 命令通过列表获取这些文件,然后绘制这些文件。

List = "`echo $(ls GRID/3D/Ratio_5/DATA.dat.* | sort -V )`"

这给了我一个文件列表 DATA.dat.0001 DATA.dat.0002 ... DATA.dat.0100 代表不同的时间,然后我可以使用它们来绘制它们

plot for [i in List] i u 1:2 title system('basename '.i)

在这种情况下,没有问题。但是,在某些情况下,我需要比较不同的Ratio_ 目录(这里没有时间依赖性),所以我创建了我的列表

List = "`echo $(ls GRID/3D/Ratio_*/DATA.dat | sort -V )`"

但是相同的绘图命令为我的所有系列赋予了相同的名称:DATA.dat。我试过了

plot for [i in List] i u 1:2 title system('dirname '.i)

但它会打印除DATA.dat 之外的整个路径,而我只对Ratio_ 号码感兴趣。

我创建了一个函数来从文件名字符串中提取比率

Ratio(filename) = "awk -F / '{print $3}' ".filename
plot for [i in List] i u 1:2 title Ratio(i)

但它只是为每个数据系列打印整个awk -F / '{print $3}' GRID/3D/Ratio_1/DATA.dat。我试图在Ratio(filename) 的定义中添加一个system 调用,但没有成功

Ratio(filename)=system("awk '{print $3}' " .filename)
plot for [i in List] i u 1:2 title Ratio(i)

但现在每个数据系列的名称就像对应 DATA.dat 的整个第 3 列一样,有数百行。

我没有想法。这可能只是一个简单的语法问题,一个错位的引号、点或逗号。我知道我可以在3D 目录中调用我的gnuplot 脚本并使用dirname 选项,但这不是我想要的。我将这个脚本与许多其他放置在同一目录中的脚本一起调用,为一篇科学文章创建图表,而将这些脚本放在不同的地方会很麻烦。

感谢任何帮助。谢谢

【问题讨论】:

    标签: awk gnuplot


    【解决方案1】:

    当你这样做时

    Ratio(filename) = "awk -F / '{print $3}' ".filename
    

    你只是在创建一个字符串,而不是执行它。此外,当你这样做时

    Ratio(filename)=system("awk '{print $3}' " .filename)
    

    您要求 awk 解析文件的内容,而不是文件名。试试:

    Ratio(filename)=system("echo ".filename." | awk -F / '{print $3}'")
    

    【讨论】:

    • 我现在无法检查,如果它有效,请告诉我
    • 谢谢@Miguel。很好的技巧和对我的问题的解释。有用。再次感谢
    • 我实际上是用这个来改善标签的外观Ratio(filename)=system("echo ".filename." | awk -F / '{print $3}' | sed 's/\_/=/'") 但我相信还有其他可能更好的选择,比如在awk 中添加END{} 子句命令。再次感谢
    【解决方案2】:

    当您将List 传递给awk 时,您需要引用List 以保留其中的换行符。比较以下:

    List=$(ls GRID/3D/Ratio*/DATA.dat)
    echo "$List"
    GRID/3D/Ratio_1/DATA.dat
    GRID/3D/Ratio_2/DATA.dat
    
    echo $List
    GRID/3D/Ratio_1/DATA.dat GRID/3D/Ratio_2/DATA.dat
    

    还有这个:

    awk -F\/ '{print $3}' <<< $list
    
    
    awk -F\/ '{print $3}' <<< "$List"
    Ratio_1
    Ratio_2
    

    【讨论】:

    • 对不起@Mark,我刚看到答案。谢谢。您的评论是正确的,但它不适用于我的问题,因为我在 gnuplot 脚本中执行此操作。 List 不会被 shell 修改。我需要完整路径才能打开要绘制的结果文件。而且我认为我不能使用您提到的修改创建另一个列表以仅获取路径的 Ratio 部分,因为我不知道如何将该 Ratio 列表的条目与绘制的文件匹配。
    猜你喜欢
    • 1970-01-01
    • 2020-07-10
    • 2014-09-30
    • 2021-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多