缩放值以使用gnuplot绘制图形

时间:2012-06-17 08:52:57

标签: awk gnuplot

我有一个下面格式的文本文件。第一列代表一个分辨率非常高的时间戳。第二个数字代表序列号。我想绘制这两个值之间的图形。序列号随着时间的推移。为此,我想缩放序列号和时间戳。可以通过从剩余时间戳中减去第一个时间戳来缩放时间戳。序列号也应该以相同的方式缩放。但是,当缩放时,序列号可能具有负值如何使用awk编写一个bash脚本来实现此目的。这个文件名是print_1010171.txt。请注意,我确实有很多相同格式的文件。所以我希望脚本能够通用。

5698771509078629376     1133254688
5698771509371165696     1150031904
5698771510035551232     1150031904
5698771510036082688     4170258464
5698771510036715520     2895583264
5698771510037202176     1620908064
5698771510037665280     346232864
5698771510038193664     3366459424
5698771510332259072     2091784224
5698771510332816128     817109024
5698771510333344512     3837335584
5698771510339882240     2562660384
5698771510340411392     1287985184
5698771510340939776     13309984
5698771510348048896     3033536544
5698771510348577280     1758861344
5698771510349228800     484186144
5698771510632804864     3504412704
5698771510633441792     2229737504
5698771510634390272     955062304
5698771510638858496     3975288864
5698771510639347712     2700613664
5698771510642663168     1425938464
5698771510643387136     134486304
5698771510643808768     3154712864
5698771510648858368     1880037664
5698771510649410560     605362464
5698771510655600384     3625589024
5698771510656128768     2350913824
5698771510656657408     1076238624

3 个答案:

答案 0 :(得分:1)

awk 'NR == 1 {basets = $1; baseseq = $2} {print $1 - basets, $2 - baseseq}' inputfile

或者,如果您不想输出初始的零对:

awk 'NR == 1 {basets = $1; baseseq = $2; next} {print $1 - basets, $2 - baseseq}' inputfile

答案 1 :(得分:1)

这是一个bash包装器脚本,可以执行您想要的操作:

#!/bin/bash

gnuplot << EOF
set terminal png truecolor size 800,600
set output 'plot_$1.png'

firstx=0
offsetx=0
funcx(x)=(offsetx=(firstx==0)?x:offsetx,firstx=1,x-offsetx)
firsty=0
offsety=0
funcy(x)=(offsety=(firsty==0)?x:offsety,firsty=1,x-offsety)

plot '$1' u (funcx(\$1)):(funcy(\$2))
EOF

要使用该脚本,请为其指定要作为参数绘制的文件的名称:

$ myscript.sh print_1010171.txt

我修改了给定here的答案以容纳两个变量。如果要从所有数据中减去最低值而不是第一个,请查看该答案。

答案 2 :(得分:1)

非常类似于丹尼斯威廉姆森的解决方案 - 这应该更有效(但可能不是你经常注意到的)并且它也会默默地忽略空行(另一种解决方案将为空行提供非常大的负数)。

#script coolscript.gp
if(!exists("DATAFILE")) DATAFILE='test.dat'
EXT_INDEX=strstr(DATAFILE,'.txt')  #assume data has a .txt extension.
set term post enh color
set output DATAFILE[:EXT_INDEX] . '.ps'  #gnuplot string slicing and concatenation
plot "< awk 'BEGIN{getline; header_col1=$1; header_col2=$2 }{if(NF){print $1-header_col1,$2-header_col2}}' ".DATAFILE using 1:2

你绝对可以使用all-gnuplot解决方案。 (参见@ andyras的好解决方案以及他与之相关的答案)。这个(替代)解决方案通过读取awk中的第一行并将变量header_col1header_col2与第1列和第2列中的数据一起分配来工作。然后从未来的columes中减去那些(如预期的那样)只要该行不为空。

请注意,可以使用以下命令从命令行调用此解决方案:

gnuplot -e "DATAFILE='mydatafile.txt'" coolscript.gp

不幸的是,引用是必要的,因为gnuplot需要它们,这意味着如果你在shell循环中使用它,你应该在我显示的外部使用双引号。

for FILE in *.dat; do
   gnuplot -e "DATAFILE='${FILE}'" coolscript.gp
done