- The added line is THIS COLOR.
- The deleted line is THIS COLOR.
* プログラミングのための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]
*** 変数名に変数は使えない??→使える。 [#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 --> 全ての/ (スラッシュ)を (空白)に置換。