2012-06-17 52 views
0

我有一個文本文件,格式如下。第一列表示一個分辨率非常高的時間戳。第二個數字表示序列號。我想繪製這些圖之間的圖兩個values.ie序列號隨着時間的推移。爲此,我想縮放序列號和時間戳。可以通過從剩餘的時間戳中減去第一個時間戳來縮放時間戳。序列號也應該以相同的方式縮放。但是,當縮放序列號可以有負值。我怎麼寫awk使用bash腳本來實現這個。這個文件名是print_1010171.txt.Please不是我有一些格式相同的文件。所以我想該腳本獲得通用。使用gnuplot縮放值以繪製圖形

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 

回答

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的第一行和在第1列和第2列分配變量header_col1header_col2與數據然後減去那些從未來columes(如預期),只要該線不空。

請注意,此解決方案可以從命令行使用被稱爲:

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

不幸的是,引號是必要的,因爲gnuplot的需要他們,這意味着,如果你在一個shell循環中使用這個,你一定要如我所示,在外部使用雙引號。

for FILE in *.dat; do 
    gnuplot -e "DATAFILE='${FILE}'" coolscript.gp 
done 
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

這裏是一個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的答案以適應兩個變量。如果您想從所有數據中減去最低值而不是第一個數據,也可以查看該答案。

+0

'echo'在這裏是不必要的。 – mgilson

+0

此外,分號無關緊要,您的輸出文件將被命名爲'plot_print_stuff.txt.png'。你也許可以使用'strstr'函數和字符串切片切斷'.txt'擴展名(如果你知道數據文件有一個'.txt'擴展)。 (否則,很好的答案;)+1 – mgilson

+0

你是對的,我不知道爲什麼我把這些分號。 – andyras