使用 cat、awk 或 sed (bash) 的多个文件的热图
Heat map from multiple files with cat, awk or sed (bash)
我正在处理多个文件,我想根据这些文件绘制热图 every ::121::600 using 3:25:43
。
有没有办法通过以下命令动态组合所有文件以获得热图:
set dgrid3d
splot '< cat data1.csv data2.csv data3.csv data4.csv' every ::121::600 using 3:25:43 w pm3d
我试过了,但似乎只有来自 data1.csv 的数据出现在图中。我对 '
或 ,
做错了什么吗? awk
或 sed
是一个选项吗?
我知道 set table
这个选项,但我更喜欢一个干净的 bash 命令选项来直接即时进行。
有没有好的资源来查找所有带有一些 gnuplot 演示的 unix 命令?
目前感谢您的回复:
所以 '
用于绘图命令:例如plot 'data1.csv' using 1:2 w l
将使用行从 data1 文件中的第 2 行打印第 1 行。这就是为什么我以前在命令中使用 '
的原因。我在 Site 那里找到了这个 bash 枪图命令的解释,但我仍然没有找到我要找的东西
感谢您对我的问题的大力回应和帮助:
这有效:
plot '< for i in data1.csv data2.csv data3.csv data4.csv; do cat "$i"; echo; done' every ::121::600 using 3:25:43 w pm3d
值得一提的是,我确实不得不在 $i
周围添加 "
广告,就像 vagoberto 提议的那样
这也是一样的:
plot '< awk "FNR==1{print \"\"}1" data1.csv data2.csv data3.csv data4.csv' every ::121::600 using 3:25:43 w pm3d
两者都适用于我的 Mac OSX 终端环境,以及安装了 gnuWin32 软件包的 Wind 7。
every ::121::600
命令告诉 gnuplot 在 每个块 上获取第 121 行到 600 行(从 0 开始计数)的数据,而不是在每个文件上。您需要预处理数据以创建块(在每个数据之间放置一条线)。
考虑以下两个数据文件:
#data1.dat #data2.dat
1 2 1.5 2.5 # line 0
3 4 3.5 4.5 # line 1
5 6 5.5 6.5 # line 2
并尝试使用 every ::2::2
绘制(即仅绘制第 2 行)。
以下指令创建单个块,因此 gnuplot 将仅绘制点 (5,6)
:
cat data1.dat data2.dat
1 2
3 4
5 6
1.5 2.5
3.5 4.5
5.5 6.5
以下指令将为每个数据文件创建一个块,以便 gnuplot 绘制点 (5,6)
和 (5.5,6.5)
:
for i in data*.dat; do cat $i; echo; done
1 2
3 4
5 6
1.5 2.5
3.5 4.5
5.5 6.5
您将通过使用 awk 'FNR==1{print ""}1' data*.dat
获得类似的结果。
总而言之,以下应该有效:
plot '< for i in data*.dat; do cat $i; echo; done' every ::2::2 using 1:2
# or
plot '< awk "FNR==1{print \"\"}1" data*.dat' every ::2::2 using 1:2
我正在处理多个文件,我想根据这些文件绘制热图 every ::121::600 using 3:25:43
。
有没有办法通过以下命令动态组合所有文件以获得热图:
set dgrid3d
splot '< cat data1.csv data2.csv data3.csv data4.csv' every ::121::600 using 3:25:43 w pm3d
我试过了,但似乎只有来自 data1.csv 的数据出现在图中。我对 '
或 ,
做错了什么吗? awk
或 sed
是一个选项吗?
我知道 set table
这个选项,但我更喜欢一个干净的 bash 命令选项来直接即时进行。
有没有好的资源来查找所有带有一些 gnuplot 演示的 unix 命令?
目前感谢您的回复:
所以 '
用于绘图命令:例如plot 'data1.csv' using 1:2 w l
将使用行从 data1 文件中的第 2 行打印第 1 行。这就是为什么我以前在命令中使用 '
的原因。我在 Site 那里找到了这个 bash 枪图命令的解释,但我仍然没有找到我要找的东西
感谢您对我的问题的大力回应和帮助: 这有效:
plot '< for i in data1.csv data2.csv data3.csv data4.csv; do cat "$i"; echo; done' every ::121::600 using 3:25:43 w pm3d
值得一提的是,我确实不得不在 $i
周围添加 "
广告,就像 vagoberto 提议的那样
这也是一样的:
plot '< awk "FNR==1{print \"\"}1" data1.csv data2.csv data3.csv data4.csv' every ::121::600 using 3:25:43 w pm3d
两者都适用于我的 Mac OSX 终端环境,以及安装了 gnuWin32 软件包的 Wind 7。
every ::121::600
命令告诉 gnuplot 在 每个块 上获取第 121 行到 600 行(从 0 开始计数)的数据,而不是在每个文件上。您需要预处理数据以创建块(在每个数据之间放置一条线)。
考虑以下两个数据文件:
#data1.dat #data2.dat
1 2 1.5 2.5 # line 0
3 4 3.5 4.5 # line 1
5 6 5.5 6.5 # line 2
并尝试使用 every ::2::2
绘制(即仅绘制第 2 行)。
以下指令创建单个块,因此 gnuplot 将仅绘制点 (5,6)
:
cat data1.dat data2.dat
1 2
3 4
5 6
1.5 2.5
3.5 4.5
5.5 6.5
以下指令将为每个数据文件创建一个块,以便 gnuplot 绘制点 (5,6)
和 (5.5,6.5)
:
for i in data*.dat; do cat $i; echo; done
1 2
3 4
5 6
1.5 2.5
3.5 4.5
5.5 6.5
您将通过使用 awk 'FNR==1{print ""}1' data*.dat
获得类似的结果。
总而言之,以下应该有效:
plot '< for i in data*.dat; do cat $i; echo; done' every ::2::2 using 1:2
# or
plot '< awk "FNR==1{print \"\"}1" data*.dat' every ::2::2 using 1:2