0

以下の形式のテキストファイルがあります。最初の列は非常に高い解像度のタイムスタンプを表します。2番目の数字はシーケンス番号を表します。これら2つの値の間にグラフをプロットしたいと思います。つまり、時間の経過に伴うシーケンス番号。この目的のためにシーケンス番号とタイムスタンプをスケーリングしたいタイムスタンプは、残りのタイムスタンプから最初のタイムスタンプを差し引くことでスケーリングできますシーケンス番号も同じ方法でスケーリングする必要がありますが、スケーリングするとシーケンス番号は負の値になる可能性があります。これを実現するために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
4

3 に答える 3

1

Dennis Williamson のソリューションと非常によく似ています -- これはより効率的であるはずです (しかし、おそらく気付くことはないでしょう)。また、空白行を黙って無視します (他のソリューションでは、空白行に非常に大きな負の数が与えられます)。

#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

これは、すべて gnuplot ソリューションを使用して確実に実行できます。(@andyras の素敵なソリューションと、彼がリンクした私の回答を参照してください)。この (代替) ソリューションは、awk の最初の行を読み取り、変数を割り当て、header_col1header_col21 と列 2 のデータを使用することで機能します。次に、行が空でない限り、(予想どおり) 将来の列からそれらを減算します。

このソリューションは、次を使用してコマンドラインから呼び出すことができることに注意してください。

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

残念ながら、gnuplot は引用符を必要とするため、引用符が必要です。つまり、これをシェル ループで使用している場合は、ここで示したように外側に必ず二重引用符を使用する必要があります。

for FILE in *.dat; do
   gnuplot -e "DATAFILE='${FILE}'" coolscript.gp
done
于 2012-06-17T22:03:34.497 に答える
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

ここでの回答を変更して、2 つの変数に対応させました。最初のデータではなくすべてのデータから最小値を減算する場合も、その回答を参照してください。

于 2012-06-17T13:23:31.780 に答える
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
于 2012-06-17T10:46:12.523 に答える