我有一个看起来像这样的文件:
0 0.000000
1 0.357625
2 0.424783
3 0.413295
4 0.417723
5 0.343336
6 0.354370
7 0.349152
8 0.619159
9 0.871003
0.415044
最后一行是它上面列出的N个条目的平均值。我想要做的是绘制一个列出每个点的图表和一个平均值的行。我知道它涉及以某种方式重新绘制,但我无法单独读取最后一个值。
答案 0 :(得分:1)
您可以使用stats命令进行两次传递以获取必要的数据
stats datafile u 1 nooutput
stats datafile u ($0==(STATS_records-1)?$1:1/0) nooutput
统计信息的第一次传递将汇总数据文件。我们真正感兴趣的是文件中的记录数,它将保存在变量 STATS_records 中。
第二遍将计算要分析的列。如果行号( $ 0 的值)等于一个小于记录数(行从0开始编号,所以这是最后一行),那么我们得到这个值,否则我们得到一个无效的值。这会导致stats命令仅查看最后一行。现在,最后一行的值存储在 STATS_max (或 STATS_min 和其他几个变量)中。
现在我们可以使用
创建绘图plot datafile u 1:2, STATS_max
我们明确说明第1列和第2列,使第一个绘图规范忽略最后一行(实际上,如果我们只做plot datafile
它应默认为此列选择并自动忽略最后一行,但这使得某些)。这会产生
另一种方法是使用外部程序过滤数据。例如,如果我们有linux命令 tail ,我们可以做 1
ave = system("tail -1 datafile")
plot datafile u 1:2, ave+0
此处, ave 将包含文件的最后一行作为字符串。在plot命令中,我们向它添加0以强制它更改为数字(否则gnuplot会认为它是文件名)。
其他外部程序也可用于读取最后一行。例如,以下对python3的调用(使用Windows样式shell引号)也是如此:
ave = system('python -c "print(open(datafile,\"r\").readlines()[-1])"')
或以下使用AWK(再次使用Windows样式的shell引号)具有相同的结果:
ave = system('awk "END{print}"')
甚至使用Perl(再次使用Windows shell引号):
ave = system('perl -lne "END{print $last} $last=$_" datafile')
<小时/> 1 tail 的使用现在已过时(根据GNU手册)命令行选项。建议使用
tail -n 1 datafile
。但是,这种缩短方式的类型较少,如果不需要向前兼容性(即您使用此脚本一次),则没有理由不使用它。
答案 1 :(得分:0)