〜2016年6月下旬〜
awkだけでもいけそうだと思いついたのがこれ。
% gawk '12==a[$0=substr($1,1,4)]+=!$2' monthly_typhoon 1984 1986 2000 2008
ただしmawkだと$0=substr($1,1,4)のほうが先に評価されて$2が常に空になるのでだめ。
というわけでこうしてみた。
% mawk '!$2&&12==++a[$0=substr($1,1,4)]' monthly_typhoon 1984 1986 2000 2008
ああ、だったらsubでYYYYMM 0のMM 0を空文字で置き換えて、
subの戻り値で置換したかどうかを判断すればよさげ。
% mawk 'sub(/.. 0/,"")&&++a[$0]==12' monthly_typhoon 1984 1986 2000 2008 % gawk 'sub(/.. 0/,"")&&++a[$0]==12' monthly_typhoon 1984 1986 2000 2008
これでgawk/mawkのどちらでも動き、しかも元の方法よりも短いしわかりやすくなった。
といって立ち上がらなくなった。
原因はWindowsが勝手にシステム更新して強制的に再起動していたからなんだけど、
もうほんとやめて欲しい。ちょっと目を離した隙に要らんことをする。
それはそれとして、VMが置いてあるフォルダをみるとSolydx.vbox-tmpみたいな名前があるので、
これをSolydx.vboxと名前を変更してからVirtualBoxを立ち上げればok。
録画終了しても録画中のまま。
こうなると追い掛け再生してたときにいちいちメニューに戻ってから、
録画リストを選ばないといけないので面倒臭い。
方法はいくつかある。
NRは通しでFNRは各ファイルでの行番号になるので1個目だけは同一になる。
そこで
' NR==FNR{file1の処理; next} {file2の処理} ' file1 file2
のようにnextで強制的に次の行の処理へ飛ばしてしまえばいい。
file1とfile2の間に変数の代入を入れることで、フラグとして使う。
' !f{file1の処理} f{file2の処理} ' file1 f=1 file2
file1の処理が終わった後でf=1になる。
昨日の件を踏まえるとこうなる。
% awk ' NR==FNR{year[substr($1,1,4)]+=$2; next} {FS=","}FNR>1{if(year[$1]!=+$NF)print $1,"not match"} ' monthly_typhoon landing.csv
monthly_typhoonの年ごとの上陸回数をyearに入れて、
landing.csvとつきあわせる。
+$NFとすることで空文字でも0にできる。
Linuxコンソール上でアルファベット順にn文字ずらした文字列を得る(シーザー暗号) | 俺的備忘録 〜なんかいろいろ〜
tacの意味がよくわからない。あとtrで空白を"."に変換しているのも不要のような。
% echo abcdefg | tr "$(printf %1sA-z)" A-zA-z bcdefgh % echo aBCdEfg | tr "$(printf %9sA-z)" A-zA-z jKLmNop
でいいのではないかな。大文字が含まれていてもいける。
% echo bcdefgh | tr A-z "$(printf %1sA-z)" abcdefg % echo jKLmNop | tr A-z "$(printf %9sA-z)" aBCdEfg
昨日のはzがAになったりといろいろとダメダメだったの出直し。
1つずらす場合は
tr a-zA-Z b-zaB-ZA
となればいいわけだが、1からこの文字列を作るのは難しい。そこで
abcdefghijklmnopqrstuvwxyz
を
bcdefghijklmnopqrstuvwxyza
に変換することにする。これはsedなら簡単だ。
% printf %s {a..z} | sed -E 's/^(.{1})(.*)/\2\1/;s/.*/&\U&/' bcdefghijklmnopqrstuvwxyzaBCDEFGHIJKLMNOPQRSTUVWXYZA
というわけで大文字も含んだ形で完成。
solydx:w/1606 [0] % echo aBCdEfgXyZ | tr a-zA-Z "$(printf %s {a..z} | sed -E 's/^(.{9})(.*)/\2\1/;s/.*/&\U&/')" jKLmNopGhI solydx:w/1606 [0] % echo jKLmNopGhI | tr "$(printf %s {a..z} | sed -E 's/^(.{9})(.*)/\2\1/;s/.*/&\U&/')" a-zA-Z aBCdEfgXyZ
でも、ちょっとださい。
Optimal way of deleting huge numbers of files
なんとも不思議な話ではある。ベンチマーク結果はなぜかすでに存在しなようで、
web.archive.org経由で。
A faster way to delete millions of files in a directory
圧倒的だ。というわけでちょっと試してみた。
同じように100万ファイルで。
% time rm -r a rm -r a 1.36s user 19.62s system 7% cpu 4:29.74 total % time rsync -a --delete empty/ b rsync -a --delete empty/ b 1.47s user 10.96s system 11% cpu 1:49.94 total
なるほど結構違う。
なんだかんだでjqを使うのが一番簡単な気がしてきた。
% jq -nr '"a"*10' aaaaaaaaaa % echo a | jq -Rr '.*10' aaaaaaaaaa
こんな感じで短く書ける。
それかjot。
% jot -s "" -b a 10 aaaaaaaaaa
あとはshuf。
% shuf -rn10 -e a | paste -sd "" aaaaaaaaaa
監視系からの通知がくるとポップアップされてとてもうっとうしい。
というわけでMuteしてたんだけど、まあこれはこれでグレーアウトされちゃって、
まったく気づかないという欠点が。
というわけで最近はDesktop notificationsのMemntions of my name or highlight wordsを使ってる。
ポップアップされないのでまあ満足。