kdenliveもLMMSもMyPaintも超便利。
‘Linux’ タグのついている投稿
MyPaintの便利そうな機能の紹介動画あげたよ。
2011年7月18日 月曜日シェルスクリプトから自動で短縮URL付きのつぶやきをTwitterに投稿。(修正)
2010年5月2日 日曜日長~いURLを短縮させようとすると短縮自体は成功するのに本文への反映がされないという現象を確認してしまったので急遽修正版。
修正と言っても1行消しただけなので、その他の仕様は前回と変わってない。
#!/bin/bash
str=”$1″
#第一引数からURLを雑に抽出し配列へ
array=( `echo “$1″ | sed -e ‘s/http/\nhttp/g’ -e ‘s/ftp/\nftp/g’ -e ‘s/\ /\n/g’ | grep tp\:\/\/` )
#配列に含まれる要素の数分処理
for (( i = 0; i < ${#array[*]}; i++ ))
{
#配列2は諸事情により削除されました。
#goo.glで配列のURLを短縮URLに/配列3へ流し込み
array3[i]=`curl -G “http://ggl-shortener.appspot.com/?url=${array[i]}” | sed ‘s/\”/\n/g’ | grep tp\:\/\/`
#変数strのURL部分を差し替え
str=`echo $str | sed “s%${array[i]}%${array3[i]}%”`
}
#文字数を軽く確認してからつぶやく
if [ ${#str} -lt 141 ]
then
#id、passリストから1行目を読み込み。※書式 id:pass
IPS=`sed -n 1p ~/working/shellscript/ips.list`
curl -u “$IPS” -d status=”$str” http://twitter.com/statuses/update.xml
exit 0
else
echo ‘文字数多いみたい。’
exit 1
fi
ガチな暫定コード。これからxAuthに対応させようと思っているので、出来たらまたコード更新の予定。しぇるすくりぷったーとか参考にしようかと思ったけども、Pythonで生で実装してるコードを公開している方がいたので、勉強がてらそっちを移植してみようと思うよ。
そこまで出来れば投稿部分に関してはTwitterクライアントのシェルスクリプト実装の中では最強だもんね。あくまで投稿部分のみだけど。
シェルスクリプトから自動で短縮URL付きのつぶやきをTwitterに投稿。
2010年4月21日 水曜日行けた行けた。半角スペースの入った引数つけるときは二重引用符じゃダメなのねw
何はともあれ上手く行ったので公開。制限事項は多分前回のものとほとんど変わらずURLの中に「スペース」が混じるとそこで区切られちゃう点。
使い方は簡単でスクリプトの実行時に引数として投稿内容を単引用符(Shift+7 のヤツ)で括ったものを付けて実行するだけ。一応複数のURLでも大丈夫。
URLと本文の切り分けに半角スペースを使っているので、半角スペースを含むURLには前述の通り使えない。
その辺のことは前回の記事を自分で読んだり実際に動かしてみたりして確認してくだしあ。
いま何か頭が働かないんだ。そんなわけで最終成果物。
#!/bin/bash
str=”$1″
#第一引数からURLを雑に抽出し配列へ
array=( `echo “$1″ | sed -e ‘s/http/\nhttp/g’ -e ‘s/ftp/\nftp/g’ -e ‘s/\ /\n/g’ | grep tp\:\/\/` )
#配列に含まれる要素の数分処理
for (( i = 0; i < ${#array[*]}; i++ ))
{
#URLエンコード/配列2へ流し込み
array2[i]=`echo “${array[i]}” | nkf -eMQ | tr = %`
#goo.glで配列2のURLを短縮URLに/配列3へ流し込み
array3[i]=`curl -G “http://ggl-shortener.appspot.com/?url=${array2[i]}” | sed ‘s/\”/\n/g’ | grep tp\:\/\/`
#変数strのURL部分を差し替え
str=`echo $str | sed “s%${array[i]}%${array3[i]}%”`
}
#文字数を軽く確認してからつぶやく
if [ ${#str} -lt 141 ]
then
IPS=`sed -n 1p ~/working/shellscript/ips.list`
curl -u “$IPS” -d status=”$str” http://twitter.com/statuses/update.xml
exit 0
else
echo ‘文字数多いみたい。’
exit 1
fi
大まかな処理の流れはコメント行の通り。
コメント行読んでどうにかしろっていうのもアレな感じのコードなので、流れだけもうちょっと詳しく書いておく。
まずは1~4行目 変数strに第一引数の中身を代入。次に配列変数arrayにURLを抽出し抽出結果を代入。
5~13行目 for文で配列に含まれる要素の数の分だけ処理。配列変数array2にURLエンコードされたarrayの中身を代入。array2の中身をgoo.glに投げて配列変数array3に結果を代入。変数strのURL部分を差し替えて上書き。
14~23行目 文字数を軽く確認して141文字未満ならつぶやく。そうでないならエラーで終了。
こんな感じ。あ、言うほど面倒くさくなかったね。どうでも良いけどいつも通りインデントが全角なのでそこだけ注意してください。
さ、あとは仕掛かりのリスト生成をこなせば、いつも通りまったり絵を描いて過ごせるよ。
ふぉふぉふぉ、役に立ったならご褒美くらいくださってもよろしくってよ。
ホラこんな所にアマゾンのウィッシュリストが。
GoogleのURL短縮サービスgoo.glを(ry 続き1。
2010年4月19日 月曜日シェルスクリプトのみで地味に進行中。
ひとまず、文中に含まれるURLっぽい文字列をgoo.glに投げて短縮URLを受け取って文中のURLを置き換える所までできた。
ただ、このままだと、複数のURLが含まれたときに困ったことになってしまうので、そこら辺まだ手を入れていかないといけない。
一応、試してみたい人のために使い方。
スクリプト実行時に引数として二重引用符で囲った文字列をつけて実行する。だけ。
あとはスクリプトが文字列中に含まれるURLっぽい文字列を短縮URLに置き換えてくれる。
ただ、実はこれ制限があってURLの中に「スペース」「()」が混じってると多分うまくいかなかったり、URLの末尾に半角スペースが無いと、本文との切り分けができずにわけ分かんないことになったりする。
「スペース」に関しては原因は明確で、URLと本文の切り分けに使ってるからなんだけども、「()」の方は、エスケープしないと構文エラーになっちゃうからという何とも言えない原因。ここちょっといまいち調べが足りてないので、いまいちはっきりしたことは言えないんだけども、どうしたものかしらと思ってる。
で、これが今の所の暫定コード。
これに、Twitterの投稿スクリプトを組み込めば、URLを自動で短縮URLに加工して投稿してくれるTwitter投稿クライアントが出来る。
#!/bin/bash
str=`echo “$1″ | grep tp\:\/\/[0-9a-zA-Z\@\"\#\$\%\&\'\*\+\,\-\.\/] `
case “${#str}” in
0 ) echo ${#str} $str ;;
* ) echo $str | sed -e ‘s/http/\nhttp/g’ -e ‘s/ftp/\nftp/g’ -e ‘s/\ /\n/g’ >test.txt
str2=`cat test.txt | grep tp\:\/\/` ;;
esac
curl -G “http://ggl-shortener.appspot.com/?url=”`echo “$str2″ | nkf -eMQ | tr = %` | sed ‘s/\”/\n/g’ | grep http >test2.txt
str3=`cat test2.txt`
echo `cat test.txt | sed “s%$str2%$str3%g”` >test2.txt
処理の流れなんかの説明は一通り形になってからやるつもり。ごちゃついてるけど、そんなに難しいこともやってないし。
GoogleのURL短縮サービスgoo.glをシェルスクリプトから使う。
2010年4月16日 金曜日やってみたかっただけw
これだけじゃ使い道は無いのでTwitterにからめてもうちょっと拡張してみるつもり。
#!/bin/bash
curl -G “http://ggl-shortener.appspot.com/?url=”`echo “$1″ | nkf -eMQ | tr = %` | sed ‘s/\”/\n/g’ | sed -n ‘/http/p’
何のひねりもないけども、使いようによっては結構便利に使えるかもしれない。
もしかするとnkfコマンドが無い環境もあるかもしれないので入ってなかったらやさしく入れてあげてください。
Kindle用の画像zipを作ってくれるスクリプトが地味にヤバそうだったので直した。
2010年3月10日 水曜日間違えてディレクトリの指定無とかで実行しちゃったときユーザルートのファイルが光の速さでお亡くなりになるのは正直アレ過ぎるのでディレクトリの指定が空だったり、解像度指定が空だったりしたときにエラーで終了するようにした。
追加したのは太字部分。
想定しているエラーの条件は以下の通り。
・ディレクトリの指定を忘れて解像度の指定のみ入れた場合 — この場合は当然exit。
・ディレクトリの指定、解像度の指定の両方を忘れた場合 — この場合は解像度指定の段階でexit。
・解像度の指定を忘れた場合 — この場合は解像度指定の段階でexit。
・存在しないディレクトリを指定した場合 — この場合はcdの実行失敗で$?に1が入っているはずなのでexit。
ホントは削除する前にお伺いを立てるようなのの方がやり方としてお行儀いい気もするけども、いちいち消すか消さないかっていうメッセージのところで処理が止められてるのも邪魔くさいのでそれはしない方向で。
使い方はそのまま。ディレクトリと対象機器(k2、kdx)を引数として付けて実行。
#!/bin/bash
case “$1″ in
k2 | kdx ) echo “err:ディレクトリが指定されていません。”
exit 1
;;
* ) cd $1 ;;
esac
case “$?” in
1 ) echo “err:ディレクトリの指定が間違っています。”
exit 1
;;
esac
#対象機器の解像度指定
##k2 — Kindle2
##kdx — Kindle DX
case “$2″ in
k2 ) rez=800 ;;
kdx ) rez=1200 ;;
* ) echo “err:対象機器が指定されていません。”
exit 1
;;
esac
#拡張子を配列に
ext=( jpg JPG jpeg JPEG gif GIF png PNG )
for (( i = 0; i < 8; i++ ))
{
#画像ファイルのみのリスト生成
ls | grep .${ext[i]} >>zlist.lst
}
#リスト行数取得
p=`wc -l <zlist.lst`
for (( i = 0; i < $((p + 1)); i++ ))
{
case “$i” in
0 ) ;;
* )
#ファイルサイズ変更後、元ファイル削除
val=`printf “%03d” $i`
flname[i]=`sed -n “$i”p zlist.lst`
convert -resize “$rez”x”$rez” “${flname[i]}” p”$val”.jpg
rm “${flname[i]}”
;;
esac
}
bn=`basename $1`
zip ../”$bn”.zip *.*
rm *.*
cd ..
rmdir “$bn”
例によって例のごとくインデントが全角です。
役に立ったならご褒美くらいくださってもよろしくってよ。
ホラこんな所にアマゾンのウィッシュリストが。
スキャナにADF付いてるけど片面スキャンしかできない人にメリットのあるシェルスクリプト
2010年2月8日 月曜日タイトルの通り。両面スキャンできるリア充爆発しろw
片面スキャンしかできなくてもADFさえあれば半自動くらいにはできるんだぜ!っていう強がりを言ってしまう非リアのためのシェルスクリプトw
最近使ってないから、使い方の記憶がいまいち曖昧なんだけど、たしか、ファイルを表を”page_a-###.jpg”、裏を”page_b-###.jpg”で保存した後、保存先のディレクトリ、画像の縦サイズ、横サイズの3つを引数としてスクリプトを実行。これでページが整列した状態の圧縮ファイルが生成される。と言う流れだったはず。
たぶん、自分の性格上、だらしない運用が出来ることがなんとなく条件になってるんだろうし。
お茶を飲みながらアニメみてたら仕事が終わってた。みたいな感じ。これだとちょっと手を動かさなきゃいけないのがアレだけど。
そうそう、久しぶりに読み返してみて思ったんだけど、ゼロ埋めってホントはもっと良いやり方あるんだよね?きっと。知ってる人いたら教えてください。是非にも。
twitterとかメールとかでも良いです。kotokoiorg(・д・`)ノシgmail.com
前置きはこの辺にしてここからスクリプト。
#!/bin/sh
zero () {
if [ $1 -lt 10 ]
then
val=`expr 00$1` #10未満
elif [ $1 -lt 100 ]
then
val=`expr 0$1` #100未満
else
val=`expr $1` #100以上
fi
}cd $1
rename ‘s/-/_/’ *pageA=`ls | grep page_a | wc -l`
pageB=`ls | grep page_b | wc -l`
count=1
pAcount=1pagenum=`ls | wc -l`
while [ $count -le $pagenum ]
do
if [ $(( $count & 1 )) -eq 0 ]
then
zero $pageB
ren1=”page_b_$val”
pageB=`expr $pageB – 1`
elif [ ${pAcount} -eq ${pageA} ]
then
zero $pAcount
ren1=”page_a_$val”
else
zero $pAcount
ren1=”page_a_$val”
pAcount=`expr $pAcount + 1`
fizero $count
ren2=”page_$val”
convert -crop $2x$3+0+0 “$1/$ren1.jpg” “$1/$ren2.jpg”
count=`expr $count + 1`
donerm page_a*.*
rm page_b*.*bn=`basename $1`
zip -5 ../$bn.zip *.*rm *.*
cd ..
rmdir $bn
スクリプトここまで。
最初のzero ()っていうのは説明もクソもなくゼロ埋めの関数ですね。
投げ込まれた数値をゼロで桁合わせしてval変数に格納しています。
もっと良いやり方知ってる人いたら教r・・・教えてください。お願いします。
ではでは、この辺から説明。
cd $1
rename ‘s/-/_/’ *pageA=`ls | grep page_a | wc -l`
pageB=`ls | grep page_b | wc -l`
count=1
pAcount=1pagenum=`ls | wc -l`
一、二行目は見た通りそのまんま、第一引数で渡されたディレクトリに移動してファイル名にあるハイフンをアンダースコアに変換。
※この変換はファイル名の書式が気にくわないとか言うことがなければなくても構いません。うちのスキャンソフトではなぜかハイフンが入ってしまって腹立つので入れてあるだけです。
三、四行目はpage_a、page_bそれぞれのファイル数を取得、格納。
五、六行目これは得に説明の必要ないですね。カウンターのプリセット。
七行目でページの総数(ディレクトリ内のファイル総数)を取得、格納。
ここまでで基本的な値の格納は完了。次はコレ
while [ $count -le $pagenum ]
do
if [ $(( $count & 1 )) -eq 0 ]
then
zero $pageB
ren1=”page_b_$val”
pageB=`expr $pageB – 1`
elif [ ${pAcount} -eq ${pageA} ]
then
zero $pAcount
ren1=”page_a_$val”
else
zero $pAcount
ren1=”page_a_$val”
pAcount=`expr $pAcount + 1`
fizero $count
ren2=”page_$val”
convert -crop $2x$3+0+0 “$1/$ren1.jpg” “$1/$ren2.jpg”
count=`expr $count + 1`
done
言わずと知れた天下のwhile文。先に設定したcount変数とpagenum変数の値が等しいかpagenum変数の値の方が小さくなるまで処理を繰り返します。
中に入っているif文はcount変数と1が共に0またはNULL以外の場合、count変数と0が同一かを判定します。※count変数と0を直接比較しても問題ないような気もしますが、変更後のテストが面倒なのでそのままになっています。ここは確か1の部分に別な変数が入っていたような記憶があるんですが・・・
この条件が真ならば、次のコードが実行されます。たぶん。この辺うろ覚えで自信ないです。
zero $pageB
ren1=”page_b_$val”
pageB=`expr $pageB – 1`
一行目でzero関数にpageB変数の値を引数として投げてval変数を書き換え。
二行目でren1変数に”page_b_$val”という文字列($valは展開された変数が入る)を格納。
三行目でpageB変数の値を1減らしてpageB変数を上書き。
一つ目の条件が偽の場合は次に出てくるelifの条件でpAcount変数とpageA変数が同一かを判定します。
elifの条件が真ならば、次のコードが実行されます。
zero $pAcount
ren1=”page_a_$val”
内容は1つ目の実行内容とほぼ同じです。
elifの条件が偽ならば、次のコードが実行されます。
zero $pAcount
ren1=”page_a_$val”
pAcount=`expr $pAcount + 1`
内容は1つ目の実行内容とほぼ同じです。
if文の処理終了後、次のコードが実行されます。
zero $count
ren2=”page_$val”
convert -crop $2x$3+0+0 “$1/$ren1.jpg” “$1/$ren2.jpg”
count=`expr $count + 1`
一行目でzero関数にcount変数の値を引数として投げてval変数を書き換え。
二行目でren2変数に”page_$val”という文字列($valは展開された変数が入る)を格納。
三行目でimagemagicのconvertコマンドをcropオプションをつけて呼び出し。$2変数、$3変数にはそれぞれ、縦横の数値が入っているはず。$1変数にはディレクトリが、$ren1変数には変換元のファイル名、$ren2変数には変換先のファイル名いずれも拡張子なしが入っています。
四行目でcount変数の値に1足してcount変数を上書き。
これらの処理がファイル数分完了後、次のコードが実行されて、処理が完了します。
rm page_a*.*
rm page_b*.*bn=`basename $1`
zip -5 ../$bn.zip *.*rm *.*
cd ..
rmdir $bn
読んでも何にも得られるものはないのにここまで読んでしまった方。本当にお疲れ様でした。
※例によって例のごとくインデントが全角です。本当にありがとうございました。
Visitorsでアクセスログを読みやすくしたりその他いろいろ。
2010年2月4日 木曜日今日はちょっと気分を変えてシェルスクリプトを一つ。
アクセスログを読みやすくしてローカルに溜め込むスクリプトです。
溜め込みついでに月ごとのログとログ取り開始からの累積ログの2種類を溜め込むようになってます。
使い方は簡単で一日一回、引数0か1か引数なしでスクリプトを呼び出すだけ。
あとは勝手にログを溜め込んで期日(毎月2日)がきたら一ヶ月分の生ログテキストと加工済みログを圧縮して片付けます。自分で使用することのみを想定しているのでそれしかできません。
引数に対応する機能は次の通りです。
・引数0はログの取得/加工後ブラウザで確認
・引数1はログをブラウザで確認のみ
・引数なしはログの取得/加工のみ
という機能・・・のはず。”はず”と言うのはうちでは0しか使ってないからなんですが確認するのも面倒なので自己責任でお願いします。
ちなみにcronで回すのがいいと思います。うちではすぐに確認するので手でやってますが。
アクセスログをローカルで読みやすく加工するためにはアクセス解析ソフトなんかを使うわけなんだけども、今回はVisitorsを使います。
なぜVisitorsかというと、うちで使ってるから。
ではでは早速スクリプトぺたり。
#!/bin/sh
mtth () {
cat ‘acl4.txt’ ‘accesslog’ >’acl3.txt’
cp ‘acl3.txt’ ‘acl4.txt’
visitors -A -m 250 ‘acl4.txt’ >’acl2.html’
}
nml () {
cp ‘acl.txt’ ‘acl2.txt’
visitors -A -m 250 ‘acl2.txt’ >’acl.html’
}
logs () {
wget -P ‘/home/user/dir/logs’ ‘ftp://user:pass@server/dir/logname’
cd ‘/home/user/dir/logs’
Dt=`date ‘+%d’`
if [ $Dt -eq 2 ]
then
#今日は2日です
mtth
rnmMt=`date -d ’2 days ago’ ‘+%Y%m’`
mv acl2.txt acl$rnmMt.txt
mv acl.html acl$rnmMt.html
zip -5 acl$rnmMt.zip acl$rnmMt.txt acl$rnmMt.html
rm acl.txt acl$rnmMt.txt
cp ‘access_log’ ‘acl.txt’
nml
else
#今日は2日ではありません
mtth
cat ‘acl2.txt’ ‘access_log’ >’acl.txt’
nml
fi
rm ‘access_log’
}
if [ ${1} -eq 0 ]
then
logs
epiphany ‘/home/user/dir/logs/acl.html’ ‘/home/user/dir/logs/acl2.html’
elif [ ${1} -eq 1 ]
then
epiphany ‘/home/user/dir/logs/acl.html’ ‘/home/user/dir/logs/acl2.html’
else
logs
fi
前に上げた株価データ取得スクリプトよりも簡単で説明もクソもないので今回は説明なしです。なんていうか動けばいいやレベルのゴミスクリプトなので。
そうそう、途中に2日か否かを確認する部分があるんですが、これは月ごとに切り分ける必要がなければ不要な部分です。
注意 – このスクリプトを使ったことで何かが起こったとしても責任は負えませんのでそのつもりで使ってください。もし万一使うようなことがあれば・・・ですが。
2月5日追記
ああ、そうだ。書き忘れてたけどもインデントを全角スペースに変換してあるからコピーしただけじゃ動かないかも。
LMMS jpwikiの紹介をして下さっている方がいるようで
2010年1月10日 日曜日ありがたいことです。
怠け者なゆうゆゆうが一人で更新作業やってるので、
抜けがまだあるにもかかわらずここ最近更新止まってますが、
これを励みに更新頑張ります。(棒
あ…あぁ……ありがてぇ! ありがてぇぇ!(敬称略)
Qtstalkerで株価データを眺めてニヨニヨするスクリプト
2009年12月8日 火曜日zigsowで以前公開したものの再掲載。そのうち修正入れて読みやすくするつもり。
記事ここから。————-
自分でよく使うシェルスクリプトを一つ。
Webで株価データを配信している、とってもありがたいサイトからファイルを落としてきてQtstalker用に整形するスクリプト。Qtstalker?何それwwwプゲラって奴は読み飛ばせ。
使い方は簡単。
実行して
当日を含めたファイル取得を行います。
Enter :
って表示されたら数字を入力するだけ。
入力された数字が例えば10だったら10日前のファイルから今日のファイルまでを取得してきてくれる。当日分だけが必要なら0と入力する(ファイル名が日付で管理されているサイトに限られるが)。
中身も簡単なので早速frontend(?)から。
ここから————————
#!/bin/sh
echo 当日を含めたファイル取得を行います。
echo -n “Enter : “
read ans
Dt=`date ‘+%y%m%d’`
if [ ${ans} -eq 0 ]
then
#当日分の取得
’/home/user/dir/down.sh’ $Dt
else
#当日と前日以前の分の取得
’/home/user/dir/down.sh’ $Dt
a=0
while [ $a -ne $ans ]
do
a=`expr $a + 1`
Dt1=`date –date “${a}”‘ days ago’ +%y%m%d`
’/home/user/dir/down.sh’ $Dt1
done
fi
ここまで————————
分かる人には見ての通りの
down.shに引数を送りつけるだけのスクリプトなんだけども一応解説。
1.この四行でまずは必要なデータを格納。
echo 当日を含めたファイル取得を行います。
echo -n “Enter : “
read ans
Dt=`date ‘+%y%m%d’`
[詳説]
1、2行目は端末内にメッセージを表示して入力待ち。ここでユーザは数字を入力。
3行目 read ans で ans に入力された数値を格納。
4行目 Dt=`date ‘+%y%m%d’` で 変数 Dt に書式付きの日付を格納。この場合の書式はYYMMDD
2.残りの15行で処理回数を振り分けて、down.shを引数付きで呼び出す。
if [ ${ans} -eq 0 ]
then
#当日分の取得
’/home/user/dir/down.sh’ $Dt
else
#当日と前日以前の分の取得
’/home/user/dir/down.sh’ $Dt
a=0
while [ $a -ne $ans ]
do
a=`expr $a + 1`
Dt1=`date –date “${a}”‘ days ago’ +%y%m%d`
’/home/user/dir/down.sh’ $Dt1
done
fi
[詳説]
1行目 if [ ${ans} -eq 0 ] は ans に格納された数値が0と同じかを判定。同じなら2〜4行目を実行。違うなら5〜14行目を実行。
2〜4行目 見たまんま。1行目の判定が真ならば、変数 Dt に格納された書式付きの日付を展開してdown.shを引数付きで呼び出す。
5〜7行目 見たまんま。1行目の判定が偽ならば、変数 Dt に格納された書式付きの日付を展開してdown.shを引数付きで呼び出す。
8行目 a=0 で a に 0 を格納。
9行目 while [ $a -ne $ans ] は ans に格納された数値が0と同じかを判定。同じなら偽、違うなら真となり、真である限り9〜14行目を繰り返す。
11行目 a=`expr $a + 1` で 変数 a に格納された数値に 1 を足す。
12行目 Dt1=`date –date “${a}”‘ days ago’ +%y%m%d`で 変数 Dt1 に書式付きの日付を格納。この場合は a 日前の日付。この場合の書式はYYMMDD。
13行目 見たまんま。繰り返し処理が実行される度に変数 Dt1 に格納された書式付きの日付を展開してdown.shを引数付きで呼び出す。
14、15行目 終了の印。
とりあえずfrontend(?)はこれで。次はbackend。
ちなみにインデントに全角スペースを使ったのでスクリプトをそのままコピーしても動かないはず。使う人がいるとは思えないけど一応。
この実行部分が揃うと、みんな怠け者になれる。素敵。
ここから一連の動作のコア部分。
fronntend(?)と比べると手抜きっぷりが尋常じゃないってくらい簡単なスクリプト。
引数を付けて実行してやればこれだけでも使える。
frontend(?)はあくまで月1とか週1の一括処理のためのもの。
ここから————————
#!/bin/sh
# ディレクトリ移動
cd /home/user/dir
# 当日分取得
wget -P ./ http://url/dir/$1.LZH
# ファイル展開
lha e $1.LZH
sed -f list.sed $1.csv > T$1.tmp
cp T$1.tmp ./tmp/T$1.tmp
sed -f list2.sed ./tmp/T$1.tmp > T$1.tmp
cp T$1.tmp ./tmp/T$1.tmp
cat -s ./tmp/T$1.tmp | sed ‘/^[[:space:]]*$/d’ > Finish$1.csv
rm $1.LZH T$1.tmp $1.csv ./tmp/T$1.tmp
ここまで————————
説明がいる部分がほとんど無いけど一応解説。
1.コメントアウトした行で説明されている通り。
# ディレクトリ移動
cd /home/user/dir
# 当日分取得
wget -P ./ http://url/dir/$1.LZH
# ファイル展開
lha e $1.LZH
[詳説]
2行目 cd で作業しやすいディレクトリに移動
4行目 wget でファイルをダウンロード。オプションで -P を指定しておかないとユーザールートに剥き身でバカバカ落とされて泣くことになる気がする。変数 $1 は実行時の引数が格納されている。
6行目 展開。他のファイル形式ならそちらに合わせる。
2.ごちゃごちゃしてるだけ。やってることはファイルのコピー・削除と内容の整形のみ。
sed -f list.sed $1.csv > T$1.tmp
cp T$1.tmp ./tmp/T$1.tmp
sed -f list2.sed ./tmp/T$1.tmp > T$1.tmp
cp T$1.tmp ./tmp/T$1.tmp
cat -s ./tmp/T$1.tmp | sed ‘/^[[:space:]]*$/d’ > Finish$1.csv
rm $1.LZH T$1.tmp $1.csv ./tmp/T$1.tmp
[詳説]
1行目 sed に list.sed という置換リストを与えて $1.csv の内容を置換 T$1.tmp に書き込む。
2行目 T$1.tmp を ./tmp/T$1.tmp にコピー。
3行目 sed に list2.sed という置換リストを与えて ./tmp/T$1.csv の内容を置換 T$1.tmp に書き込む。
4行目 T$1.tmp を ./tmp/T$1.tmp にコピー。
5行目 cat で ./tmp/T$1.tmp を読み込み結果をパイプで sed に渡す。読み込み結果を受け取った sed が ‘/^[[:space:]]*$/d’ (半角スペースを削除) して Finish$1.csv に書き込む。
7行目 処理に利用した中継ファイルを削除。
※変数 $1 は実行時の引数が格納されている。
こんな感じ。
ちなみに list.sed と list2.sed は自分で作るべきだと思うけど一応サンプルを置いておく。
list.sed
銘柄コードと市場番号の組み合わせになっている部分を、銘柄コードと企業名に置換するリスト。この後もズラリと4000件くらい続く。
s/,1001,1,/,1001,”nikkei225″,/g
s/,1002,1,/,1002,”TOPIX”,/g
s/,1003,1,/,1003,”Cor30″,/g
s/,1004,1,/,1004,”Lar70″,/g
list2.sed
上場廃止や銘柄変更、市場変更等で使い物にならなくなったデータを削除するリスト。一行で全部。
常に最新の銘柄リストを使えば必要ないけど面倒なのでそのまま削除する方向で運用する。
s/[0-9]\{4\}\/[0-9]\{2\}\/[0-9]\{2\},[0-9]\{4\},[0-9],[0-9]*,[0-9]*,[0-9]*,[0-9]*,[0-9]*//g
[注意事項]
自分で使うためだけに書いたものなので例外は一切考慮されてません。入力は1回だけなので考える必要もないと思うけど。ちなみに数字の代わりに別な何かを入力したり未入力で実行したりすると多分当日分のみの取得処理が実行されるはず。違ったかな。未確認だけど確認はしない。