* プログラミングのためのTIPS [#uf7699ac] よく忘れるチョイネタは、しっかりとメモしておこう。 #contents ** Fortran [#b5e5c4ce] *** unformattedなsequentialの入出力 [#r9d30534] - 衝撃の事実! unformattedでsequential なアクセスの場合、データのカタマリごとにアクセスが行われる。~ 要は、カタマリの間には8バイトのスペース(?)が入って、一回のアクセスがカタマリの大きさに対してどうであろうと、次のアクセスは次のカタマリに行っちゃう、ということだ。~ たぶん、いまさら気づいているのが遅いんだろうけど、今までDirect Accessが多かったからしかたないのだ。 *** formattedなsequentialの入出力 [#h0b54c6e] - いまさらでいうと、formattedの自由書式(*)のとき、入力は,(カンマ)も区切り文字として認識するみたいだ。知らなかった(恥)。 *** iargc() [#pe2d5080] 引数の数。 if (iargc().ne.3) then write(6,*) 'Usage: xxxxxx' stop end とか入れておくと、すっかり忘れたプログラムが何をするものか思い出されやすい。 ** Shell (sh,csh,tcsh) [#rd9ecdac] *** 互換しない組み込み関数 [#b946efe9] shではexport, cshではsetenv。 *** 変数名に変数は使えない??→使える。 [#t18bd1bc] 例えば #!/bin/sh -f VAR1="aaa" VAR2="bbb" VAR3="ccc" NUM=1 while [ $NUM -le 3 ] ; do echo VAR${NUM} done %%なんてことは''できない''。%% Sさんから情報提供があり、できることがわかりました。上の例でいうと、このようにやります。 #!/bin/sh -f VAR1="aaa" VAR2="bbb" VAR3="ccc" NUM=1 while [ $NUM -le 3 ] ; do VAR=\$VAR$NUM VAR=`eval echo $VAR` echo $VAR NUM=`expr $NUM + 1` done exit メモ書いていて良かった~。 ** awk [#mb29cab0] *** 書式(printf) [#k6e7422f] Cと同じ。小数%f、指数%e、整数%i。改行用の\nも忘れるな。%A.Bfで、A:総文字数、B:小数点以下桁。%A.Biの場合、Bの位まで0が埋められる。 awk '{SUM=SUM+$1}END{printf("%f\n",SUM/NR)}' list echo 1 | awk '{printf("%2.2i\n",$1+1)}' *** 正規表現 [#cf680f28] - ファイル名:FILENAME - 行:NR - フィールド数:NF - フィールド全部:$0 *** 文字列と数値列 [#b0d08842] 数値列として入力しているつもりが文字列と認識され、思ったとおりいかないときがある。特にshellスクリプトの中で、shell変数を呼んだときに起きやすい。たとえばshellのなかで、 VAL=50 echo 100 | awk '$1 < "'"${VAL}"'" {print "awk think "$1" < ""'"${VAL}"'"} \ awk '$1 > "'"${VAL}"'" {print "awk think "$1" > ""'"${VAL}"'"} を実行すると、 awk think 100 < 50 と出力される。これは、要するに文字列としては1より5の方が序列が早いから。 ここで数値列をはっきりさせたいときは+0などを追加すればよい。たとえば、 VAL=50 echo 100 | awk '$1 < "'"${VAL}"'"+0 {print "awk think "$1" < ""'"${VAL}"'"} \ awk '$1 > "'"${VAL}"'"+0 {print "awk think "$1" > ""'"${VAL}"'"} とすればよい。 参考:http://aoki2.si.gunma-u.ac.jp/Hanasi/Algo/letsawk/ValueOrString.html ** sed [#a63fe483] *** 置換 [#e19d699a] sed -e s/"\/"/" "/g sample.txt --> 全ての/ (スラッシュ)を (空白)に置換。 ** その他のコマンド [#h2e940b6] *** tar [#taf05d35] - その場の隠しファイル隠しディレクトリだけtarする。ホームディレクトリのバックアップ時など。 $ tar cvf hiddenfile.tar .[^.]* 一段下がって、ディレクトリ名を指定すれば隠しファイルもすべてtarされる。(/home/keiをtarしたいときは、cd /home ; tar cvf tarfile kei )