綾小路龍之介の素人思考

[Perl] 表計算フィルタ

よくあるデータの形式として、1列目にxの値、2列目にyの値を出力されたデータファイルがあるんだな。これらのデータの組を読み込んで加工して、新しいファイルを作ることを考えるんだな。

とりあえずテストファイルとして、下の様にして標準出力1列目にxの値、2列目にexp(x)の値を出力してみるんだな。

D:\>perl -le "sub f(){return exp($_);} for(1..20){$f=&f($_); print \"$_ $f\";}"
1 2.71828182845905
2 7.38905609893065
3 20.0855369231877
4 54.5981500331442
5 148.413159102577
6 403.428793492735
7 1096.63315842846
8 2980.95798704173
9 8103.08392757538
10 22026.4657948067
11 59874.1417151978
12 162754.791419004
13 442413.39200892
14 1202604.28416478
15 3269017.37247211
16 8886110.52050787
17 24154952.7535753
18 65659969.1373305
19 178482300.963187
20 485165195.40979
D:\>

実行結果が確認できたからこれをパイプ処理でa.datに書き込むんだな。ここまででデータファイルができたんだな。

D:\>perl -le "sub f(){return exp($_);} for(1..20){$f=&f($_); print \"$_ $f\";}">a.dat
D:\>

次はこれを加工することを考えるんだな。-aオプションを使ってオートスプリットモードとし、各列の内容を特殊配列@Fに読み込むんで、これを加工するんだな。ここでは、入力ファイルa.datの1列目の逆数を取り、2列目の自然対数を取ったんだな。

D:\>perl -alne "$F[0]=1/$F[0]; $F[1]=log($F[1]); print \"$F[0] $F[1] \"" a.dat
1 1
0.5 2
0.333333333333333 3
0.25 4
0.2 5
0.166666666666667 6
0.142857142857143 7
0.125 8
0.111111111111111 9
0.1 10
0.0909090909090909 11
0.0833333333333333 12
0.0769230769230769 13
0.0714285714285714 14
0.0666666666666667 15
0.0625 16
0.0588235294117647 17
0.0555555555555556 18
0.0526315789473684 19
0.05 20
D:\>

少し見づらいけど、1行目には1/$x、2行目にはlog(exp($x))=$xが表示されていることがわかるんだな。

ソーシャルブックマーク

  1. はてなブックマーク
  2. Google Bookmarks
  3. del.icio.us

ChangeLog

  1. Posted: 2007-11-15T13:25:01+09:00
  2. Modified: 2007-11-15T04:43:38+09:00
  3. Generated: 2017-09-26T23:09:18+09:00