Cygwinでgnuplotやxcrysdenを使うとき、毎回起動に時間がかかる&見た目のよろしくないxterm windowを表示するのを何とかならないかと思っていたところ、xtermを起動せずにX serverのみを立ち上げるコマンドを見つけた。
run xwin -multiwindow -noclipboard
これでwindowsがより使いやすくなった。
時間の順序
トラジェクトリがちゃんと順番どおりになっているかの、クイックチェック。
$ grep time pos.xyz | awk ‘{$a=$3; sub(/.$/,””,$a); print $a}’ > time.txt
$ awk ‘NR==1{s0=$1 } NR!=1{r=$1-s0; s0=$1; if (r!=1) print $1, r}’ time.txt > test
1行目は、ステップ数のあとの,を消す操作をしている。
2行目は、前の行との差を取って、それが決まった差ではなかったら値を出力するようにしている。
角度の記号(°)
x11だと \260 で書けるがepsでは見えない。
eps用には{/Symbol \260}
かえる飛びループ
for文で三つ飛ばしのループにしたい場合。
いくつかバリエーションはあるが、個人的にわかりやすかったのが
for i in (0..N).step(3) do puts i end
データの2列目の平均
ネットで拾ってきたものだが、
データファイルの2列目のみを平均するスクリプト。
RubyでいうHashのような配列を使用している。
高度すぎて、フォローするのにちょっと時間かかった…
#!/bin/bash awk ' NF>=2 { sum[$1]+=$2;num[$1]++; } END { for(n in sum){ if ( num[n] > 0 ) { print n, sum[n]/num[n]; } } }' "$@" | sort -k1,1g
列の生成
ファイルの行数を読み取って行数だけ計算を行うプログラムを
書こうとしたが、NUMを数値だと認識してもらえず、
NUMを超えても延々と走ってしまう(危険!)
#!/bin/bash NUM=`wc dipole.txt | awk '{print $1}'` echo $NUM for ((i=0;i<${NUM};i++)); do echo `expr $i \* 4` >> time.txt done
forループを使うのはやめて、awkを使ってみることにした。
awk ‘{print NR*4, $3*$4}’ dippolx.txt > t-ma.txt
列の掛け算くらいだったら、こちらの方が簡単。
Tableでのx,y,zリスト作成
x,y,zのデータリストを作成して3次元プロットを描きたいとき、
t3 = Table[{x, y, Mod[x, y]}, {x, 30}, {y, 20}]
とするとリストのリストのリストになってしまい({}が一つ多い)プロットできない。
Flatten[t3,1]
で平坦化してやると解決した。
paste -s
テキストファイルから情報を抜き出してx, yのテキストデータを作りたいのだが、
>> のように行を追加するコマンドはあっても
x
というファイルに y を追加して
x y
というファイルを作るコマンドはない…?
仕方ないので、
x
y
というファイルxy.txtを
paste -s xy.txt
で2列のファイルにする。これを繰り返して
x1 y1
x2 y2
x3 y3
…
とデータを追加していく。中間ファイルができてしまうのが気持ち悪い…
列の計算
データ列の情報を使って計算したいとき。
2列目のデータのlog10を出力。
awk ‘{print log($2)/log(10)}’ trc.data
数値の取り出しと演算
ファイル中一番最後の原子のz座標を取り出して足し算したいとき。
awkなら読み取った数値(本来は文字列)を自動的に浮動小数点として扱ってくれる。
ただし、表示桁数が少ないので、OFMTを使って増やす。
tail -1 dum.xsf | awk '{ OFMT = "%.8f"} {print $NF+5.95907033}'