「Bash」カテゴリーアーカイブ

ファイルの一括操作

遅ればせながら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

 

 

重複行の削除

元の出力の方を後でちゃんと変えるべきなのだが、実験データを出力した際に精度が足りず、データの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

Cygwin X

Cygwinでgnuplotやxcrysdenを使うとき、毎回起動に時間がかかる&見た目のよろしくないxterm windowを表示するのを何とかならないかと思っていたところ、xtermを起動せずにX serverのみを立ち上げるコマンドを見つけた。
run xwin -multiwindow -noclipboard
これでwindowsがより使いやすくなった。

参考URL

時間の順序

トラジェクトリがちゃんと順番どおりになっているかの、クイックチェック。

$ 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列目の平均

ネットで拾ってきたものだが、
データファイルの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
列の掛け算くらいだったら、こちらの方が簡単。