mattak's blog

人生を1ミリ進める

gawkべんりだ

よくやる処理がgawkで便利にできると知ったのでいくつかメモ

画像サイズ変更

例: - sample.png => sample.jpg

従来 (確認 => 実行)

$ for f in $(ls *.png); do; echo convert -geometry 480x480 $f ${f/.png/.jpg}; done
$ ^echo^

gawk (確認 => 実行)

$ ls *.png | gawk '{a=$1; sub(/\.png$/,".jpg",a); print "mv",$1,a}'
$ ls *.png | gawk '{a=$1; sub(/\.png$/,".jpg",a); print "mv",$1,a}' | sh

従来のやり方が手癖に残ってて、そっちを使うことが多いけど、gawkパターンはきちんと正規表現できたりパイプできたりするので使い分けていこうとおもう

合計

例: pngファイルの容量調べる

$ find Assets -type f -name '*.png' | xargs -n1 ls -l | gawk '{SUM+=$5}END{print SUM/1024,"KB"}'
268.779 KB

集計

例: フォルダごとの容量調べる

$ find . -type f -name '*.png' | xargs -n1 ls -l | gawk '{ dir=gensub(/^(.+)\/[^\/]+$/,"\\1","g",$9); a[dir]+=$5 }END{ for (k in a) printf("%s\t%.2f\n", k, a[k]/1024)}' | sort -n -k2
./node_modules/mapnik/lib/binding/node-v48-darwin-x64/share/mapnik/gdal 1.97
./node_modules/tilelive-vector/node_modules/tiletype/test/fixtures  12.66
./node_modules/tiletype/test/fixtures   12.66
./node_modules/boom/images  28.79
./node_modules/mapnik/node_modules/boom/images  28.79
./node_modules/hoek/images  37.05
./node_modules/mapnik/node_modules/hoek/images  37.05
./node_modules/hawk/images  76.83
./node_modules/mapnik/node_modules/hawk/images  76.83
./node_modules/node-pre-gyp/node_modules/hawk/images    76.83
./node_modules/tilelive-vector/node_modules/hawk/images 76.83

ヒストグラム

例: material-design-icons内のpngのファイル容量(byte) 分布

$ find . -type f -name '*.png' | xargs ls -l | gawk 'function step(n,s){return int(n/s)*s}function idx(n){ return n<1000 ? step(n,100) : "1000+" }{ a[idx($5)]++ }END{ for (k in a) print k,a[k] }' | sort -n -k1
0 1242
100 16501
200 17071
300 11819
400 8396
500 5590
600 4340
700 2934
800 2250
900 1753
1000+ 6023

行集計の便利さを感じる. こっからサクッとグラフにできるとさらにいいなあ

試行回数7