Awk 使用gnuplot缩放值以绘制图形

Awk 使用gnuplot缩放值以绘制图形,awk,gnuplot,Awk,Gnuplot,我有一个以下格式的文本文件。第一列代表一个分辨率非常高的时间戳。第二列代表序列号。我想在这两个值之间绘制一个图表。即序列号随时间的变化。为此,我想缩放序列号和时间戳。时间戳可以通过减去来缩放剩余时间戳中的第一个时间戳。序列号也应以相同的方式缩放。但是,缩放时,序列号可能会有负值。如何使用awk编写bash脚本来实现此目的。此文件名为print_1010171.txt。请注意,我确实有许多相同格式的文件。因此,我希望脚本能够通用的 5698771509078629376 113325468

我有一个以下格式的文本文件。第一列代表一个分辨率非常高的时间戳。第二列代表序列号。我想在这两个值之间绘制一个图表。即序列号随时间的变化。为此,我想缩放序列号和时间戳。时间戳可以通过减去来缩放剩余时间戳中的第一个时间戳。序列号也应以相同的方式缩放。但是,缩放时,序列号可能会有负值。如何使用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
或者,如果不想输出初始零对:

awk 'NR == 1 {basets = $1; baseseq = $2; next} {print $1 - basets, $2 - baseseq}' inputfile
或者,如果不想输出初始零对:

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

下面是一个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

我修改了给出的答案以适应两个变量。如果要从所有数据中减去最小值,而不是第一个值,请参见该答案。

下面是一个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

我修改了给出的答案以适应两个变量。如果你想从所有数据中减去最小值,而不是第一个值,也可以看看这个答案。

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

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

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

与丹尼斯·威廉姆森(Dennis Williamson)的解决方案非常相似——这应该更有效(但可能不是你所注意到的),而且它也会默默地忽略空行(另一种解决方案会为空行提供非常大的负数)

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

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

echo
在这里是不必要的。此外,分号无关紧要,您的输出文件将被命名为类似于
plot\u print\u stuff.txt.png
。您可能可以使用
strstr
函数和字符串切片来切断
.txt
扩展名(如果您知道数据文件有
.txt
扩展名)。(否则,回答很好;)+1此处不需要
echo
。此外,分号无关紧要,输出文件的名称类似于
plot\u print\u stuff.txt.png
。您可能可以使用
strstr
函数和字符串切片来切断
.txt
扩展名(如果您知道数据文件有
.txt
扩展名)。(否则,回答很好;)+1
for FILE in *.dat; do
   gnuplot -e "DATAFILE='${FILE}'" coolscript.gp
done