2012-06-17 8 views
0

У меня есть текстовый файл в нижнем формате. Первый столбец представляет собой метку времени с очень высоким разрешением. Второе число представляет собой порядковый номер. Я хочу построить график между этими два значения.ie Число последовательностей С течением времени. Для этой цели я хочу масштабировать порядковый номер и временную метку. Временную метку можно масштабировать, вычитая первую метку времени с оставшихся штампов времени. Серийный номер также должен масштабироваться одинаково. Однако при масштабировании порядковый номер может иметь отрицательные значения. Как я могу написать скрипт bash с помощью awk для достижения этого. Это имя файла - print_1010171.txt. Пожалуйста, не то, что у меня есть несколько файлов того же формата. Я хочу сценарий для получения общего.Масштабирование значений для построения графика с использованием 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 и присваивая переменные header_col1 и header_col2 с данными в столбце 1 и столбце 2. Затем он вычитает из будущих колоний (как и ожидалось), пока линия не является пустой.

Обратите внимание, что это решение может быть вызван из командной строки с помощью:

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

К сожалению, кавычки необходимы, так как Gnuplot нуждается в них, а это означает, что если вы используете это в цикле оболочки, вы должны обязательно я показываю двойные кавычки снаружи.

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

Вот скрипт-обертка Баш, который должен делать то, что вы хотите:

#!/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

«эхо» здесь не нужно. – mgilson

+0

Кроме того, точки с запятой не имеют значения, и ваш выходной файл будет называться чем-то вроде 'plot_print_stuff.txt.png'. Вероятно, вы могли бы использовать функцию 'strstr' и строковое срез, чтобы отрезать расширение' .txt' (если вы знаете, что файл данных имеет расширение '.txt'). (В противном случае, хороший ответ;) +1 – mgilson

+0

Вы правы, я не уверен, почему я положил эти точки с запятой. – andyras

Смежные вопросы