使用awk根据文件名设置gnuplot中数据系列的标题

时间:2014-11-05 00:55:56

标签: awk gnuplot

我试图使用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 )`"

但是同样的plot命令为我的所有系列命名: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。我尝试在system的定义中添加Ratio(filename)次调用,但没有成功

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选项,但这不是我想要的。我将这个脚本与放在同一目录中的许多其他人一起调用,为科学文章创建图表,并将这些脚本放在不同的地方将是一团糟。

感谢任何帮助。感谢

2 个答案:

答案 0 :(得分:2)

当你这样做时

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

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

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

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

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

答案 1 :(得分:1)

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

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