目次

スクリプト言語入門

データの抽出

awk実習

Lesson 1

データがsample_in.textという名前のファイルに

T        Beta             B-factor        Energy          Specific Heat
0.01     100.0	          3.72008E-44     -1.0000000      3.72008E-40
0.02491   40.14452027     3.67668E-18     -1.0000000      5.92528E-15
0.03982   25.11300854     1.24039E-11     -1.0000000      7.8227E-09
.......   .......         .......         .......         .......
.......   .......         .......         .......         .......
.......   .......         .......         .......         .......

のような形で収容されていたとしよう。このファイルからTとEnergyだけのデータを抽出して

T        Energy 
0.01	-1.0000000
0.02491	-1.0000000
0.03982	-1.0000000
....... .......
....... .......
....... .......

のような内容のファイルをsample_out.dataという名前でつくるためには、ターミナルで

 $ awk '{print $1, $4}' sample_in.text > sample_out.data 

と入力する。必ず、カレントディレクトリをsample_in.textが存在するディレクトリにして行うこと。

練習

ファイルsample.dataを作成し、以下のコマンドを実行し、その意味を考えよ。

 $ awk '{print $0}' sample.data
 $ awk '{print NR, $0}' sample.data
 $ awk '{print NF, $0}' sample.data
 $ awk '{print $1}' sample.data
 $ awk '{print $2}' sample.data
 $ awk '{print $3}' sample.data
 $ awk '{if(NR!=1){print 1./$1}}' sample.data
 $ awk '{for(i=1;i<=NF;i++){print $i}}' sample.data
 $ awk '{for(i=1;i<=NF;i++){printf("%s ", $i)}}' sample.data
 $ awk '{for(i=1;i<=NF;i++){printf("%s ", $i);} printf("\n");}' sample.data

演習

1/T vs Log(B-factor) のグラフを作成せよ。

Lesson 2

sample.dataを使ってフィッティングを行った後、その結果を用いてデータを変更し、縦軸をyからΔy(yの極小点からの変化分)に変更する。

#!/usr/bin/awk -f
BEGIN{
  c = -2.26108426652;
}
{
  x = $1;
  y = $2 - c;
  printf ("%lf %lf\n", x, y);
}
$ awk -f mk.awk sample4.text > sample4.data
$
$ ./mk.awk
-bash: ./mk.awk: Permission denied
$ chmod +x mk.awk 
$ ./mk.awk sample4.text > sample4.data
$ 

演習

xについてもΔxに変換したグラフを作成せよ。

Lesson 3

Dacapoで計算した結果のtextファイルをどんなものでもよいので一つ用意する。(ここではsample_data.textという名前だとする) 以下のコマンドを実行し、その意味を考えよ。

$ cd Desktop/
$ grep TOT sample_data.text | more
 TOT:  CPU time                  Total energy
 TOT:                   LDA            GGA            LDA
 TOT:             PerdewZunger   PerdewWang91      VosWilNus
 TOT:  CPU time   non-selfcons       selfcons   non-selfcons
 TOT:   seconds          eV             eV             eV
 TOT:    1017.8     -6803.5442     -6860.0279     -6802.5257
 TOT:    1310.8     -6801.7251     -6859.0696     -6800.8858
 TOT:    1593.9     -6793.3429     -6853.4954     -6792.4696
 TOT:    1876.4     -6787.8535     -6852.2423     -6786.9467
.
.
.
 TOT:    5911.9     -6786.6510     -6851.1469     -6785.7052
$ 
imia:Desktop kimi$ grep TOT sample_data.text | awk '{print $4}' | more
Total
LDA
VosWilNus
non-selfcons
eV
-6860.0279
-6859.0696
-6853.4954
-6852.2423
-6851.3765
-6851.2690
.
.
.
imia:Desktop kimi$ awk '/TOT/{print $4}' sample_data.text | more
Total
LDA
VosWilNus
non-selfcons
eV
-6860.0279
-6859.0696
-6853.4954
-6852.2423
-6851.3765
-6851.2690
-6851.6934
-6851.2849
.
.
.

演習

sample_data.textから次のようなファイルを作成し、グラフを描け。その後、縦軸は最後のエネルギーが0になるように変換し再度グラフにせよ。

N eV
1    -6860.0279
2    -6859.0696
3    -6853.4954
4    -6852.2423
5    -6851.3765
6    -6851.2690
7    -6851.6934
8    -6851.2849
.
.
.
112    -6851.2690
113    -6851.6934
114    -6851.2849

ヒント

こんな感じのスクリプトを書く。

#!/usr/bin/awk -f
BEGIN{
  e0 = -6860.5345;
  i = 0;
}
/TOT/{
	e = $4 + 0;
	if (e != 0) {
		printf ("%lf %lf\n", i, e - e0);
		i++;
	}
}