遅ればせながらfindの使い方がわかってきた。
すべてのepsファイル(Mac時代の名残り)をpngに一括変換するスクリプト
#!/bin/sh
for file in `find . -maxdepth 1 -name \*.eps -type f`;
do
echo $file
convert -rotate 90 $file `basename $file .eps`.png
done
exit
遅ればせながらfindの使い方がわかってきた。
すべてのepsファイル(Mac時代の名残り)をpngに一括変換するスクリプト
#!/bin/sh
for file in `find . -maxdepth 1 -name \*.eps -type f`;
do
echo $file
convert -rotate 90 $file `basename $file .eps`.png
done
exit
for i in {1..408};do echo -n $i ; echo -n ” “; done
CP2KのFIXED ATOMリストをつくるときのワンライナー。
echo -n は改行しないオプション。
0から240までのランダムな数を6回取得したいとき。
for i in `seq 1 6`; do echo `expr $RANDOM % 240`; done;
元の出力の方を後でちゃんと変えるべきなのだが、実験データを出力した際に精度が足りず、データのX軸がいくつか重複してしまった。そんなデータでも、ざっくりでもよいからとりあえず解析すべく、重複するデータを削除して整理したい。その時のコマンド。
awk ‘!a[$1]++’ data.txt
なお、
awk ‘!a[$0]++’ data.txt
とすると、行全体で重複を判定できる。
Gaussianだと振動数が3列にわたって表示されるのでコピーしにくい。
3列にわたって出力されるものを1列に直すbashワンライナー。
ちょっと冗長な気はするが、とりあえず動けばいいということで。
(awkのprintで改行を打ち込めないかと思ったのだが、\nではダメで、代替手段を探すのが面倒に)
grep Frequencies FREQ.LOG | cat | while read line ; do echo $line | cut -f3 -d’ ‘ ; echo $line | cut -f4 -d’ ‘; echo $line | cut -f5 -d’ ‘; done
awkを使って度数分布(1列目に階層値、2列目に頻度が出力されている場合)から平均、標準偏差を計算。
awk ‘{m+=$1*$2} {n+=$2} {sq+=$1*$1*$2} END{print m/n, sqrt(sq/n-(m/n)^2);}’ filename
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行目は、前の行との差を取って、それが決まった差ではなかったら値を出力するようにしている。
ネットで拾ってきたものだが、
データファイルの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
列の掛け算くらいだったら、こちらの方が簡単。