〜2016年7月上旬〜
先日のrsyncの実験で100万ファイルを作ったわけだけど、
普通に引数で指定すると長すぎてエラーになってしまう。
% time touch a/{01..1000000} zsh: 引数リストが長すぎます: touch
こういうときはどうするかというとxargsを使う。
これがxargsの本来の使い方でOSの制限内の引数サイズで分割してコマンドを実行してくれる。
% time seq -w 1000000 | xargs touch seq -w 1000000 0.90s user 0.01s system 2% cpu 34.366 total
ファイルを作るだけでも結構時間がかかる。
jqで。
% echo 'つおたくところうやうさきよん' | jq -Rr './""|.[keys|group_by(.%3)[1,2,0][]]' お と う さ ん た こ や き つ く ろ う よ
ちょっと縦に場所を食ってるのでpasteで横に。
% echo 'つおたくところうやうさきよん' | jq -Rr './""|.[keys|group_by(.%3)[1,2,0][]]' | paste -sd "" おとうさんたこやきつくろうよ
実はjqだけでもできる。
% echo 'つおたくところうやうさきよん' | jq -Rr '[./""|.[keys|group_by(.%3)[1,2,0][]]]|join("")' おとうさんたこやきつくろうよ
ちょっと解説。./""はsplit("")と同じで1文字毎に配列に変換してる。
% echo 'つおたくところうやうさきよん' | jq -Rc './""' ["つ","お","た","く","と","こ","ろ","う","や","う","さ","き","よ","ん"]
ここから「おとうさんたこやきつくろうよ」を拾う。
index的には[1,4,7,10,13,2,5,8,11,0,3,6,9,12]という配列ができれば抜き出せる。
% echo 'つおたくところうやうさきよん' | jq -Rc '[./""|.[1,4,7,10,13,2,5,8,11,0,3,6,9,12]]' ["お","と","う","さ","ん","た","こ","や","き","つ","く","ろ","う","よ"]
その配列はそれぞれ3で割って1,2,0余るものなのでkeys|group_by(.%3)[1,2,0]と表現できる。
% echo 'つおたくところうやうさきよん' | jq -Rc '[./""|keys|group_by(.%3)[1,2,0][]]' [1,4,7,10,13,2,5,8,11,0,3,6,9,12]
以上まとめると最初の例になる。
結構便利。transposeが簡単にできるのがいいね。
Debian系ならそのものずばりのrsでインストールできる。
% sudo apt-get install rs
transposeは-Tでok。それとxargs -n3みたいなのも可能。
% seq 100 | rs 0 10 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 % seq 100 | rs -j 0 10 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 % seq 100 | rs -j -g1 0 10 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 % seq 100 | rs 0 10 | rs -j -g1 -T 1 11 21 31 41 51 61 71 81 91 2 12 22 32 42 52 62 72 82 92 3 13 23 33 43 53 63 73 83 93 4 14 24 34 44 54 64 74 84 94 5 15 25 35 45 55 65 75 85 95 6 16 26 36 46 56 66 76 86 96 7 17 27 37 47 57 67 77 87 97 8 18 28 38 48 58 68 78 88 98 9 19 29 39 49 59 69 79 89 99 10 20 30 40 50 60 70 80 90 100
ピタゴラ暗号棒もいける。
% echo 'つおたくところうやうさきよん' | grep -o . | rs 0 3 | rs -T -g0 | sed '1{h;d};$G' おとうさん たこやき つくろうよ
Linux Lite 3.0 Final Released
いつのまにかリリースされてたのでupgradeするかと思ったら、
最後のほうにこんな文言が。
There is NO upgrade from Series 2 ( 2.0, 2.2, 2.4, 2.6, 2.8 ) to Series 3.
まじか。インストールし直しだ。
それはそれとしてこのままdo-release-upgradeするとどうなるのか?
かなり悪い。
bot-userの生成とかOutgoing Webhooksの設定保存とかしようとすると、高い確率で失敗する。
これがエラーもなく単に元の値に戻るだけだったりするので非常にわかりにくい。
最初は気づかなかったくらい。
なぜか反映されないなと確認して何度か実行してようやく気づいた。
いろいろ試しているとGoogle Chromeだとそんな感じになるようで。
Firefoxでは起きてない。
というわけでSlackの設定で変なことが起きたらGoogle Chromeを疑ってみよう。
xargsはコマンドを省略すると/bin/echoを呼ぶ。
ということはxargs -n1は分割された要素の数だけ/bin/echoを実行してしまう。
10000個で5秒もかかってしまう。
% echo {1..10000} | time -f %E xargs -n1 > /dev/null 0:04.98
そこでtr -s ' ' '\n'の出番だが、fmt -1でもいいかもしれない。短いし。
% echo {1..1000000} | sed 's/ / /g' | /usr/bin/time -f %E tr -s ' ' '\n' > /dev/null 0:00.91 % echo {1..1000000} | sed 's/ / /g' | /usr/bin/time -f %E fmt -1 > /dev/null 0:00.97
速度もそんなに変わらない。
七夕ということでピタゴラ暗号棒と短冊を合体してみた。jqで。
% echo 'つおたくところうやうさきよん' | \ jq -Rr './""|[.[keys|group_by((.+2)%3)[][]]]|"+----+","| \(.[]) |","+----+"' +----+ | お | | と | | う | | さ | | ん | | た | | こ | | や | | き | | つ | | く | | ろ | | う | | よ | +----+
複数の条件があるときは全部愚直に書かないといけない。
% seq 10 | jq 'select(. == 1 or . == 3 or . == 8)' 1 3 8
正規表現でと思ったが、元が数値なのでかえって面倒なことに。
% seq 10 | jq 'select(tostring|test("^(1|3|8)$"))' 1 3 8
jqではcommaでまとめられるようだ。
% seq 10 | jq 'select(. == (1,3,8))' 1 3 8
cf: json - How to filter array of objects by element property values using jq? - Stack Overflow
短冊jq芸を書こうと思ってたら寝落ちして明け方twitterに投稿したのがこれ。
% echo ちょっと出遅れた | jq -Rrs '"+----+","| \((./"")[:-1][]) |","+----+"' +----+ | ち | | ょ | | っ | | と | | 出 | | 遅 | | れ | | た | +----+
やはり寝惚けてたらしく-sなんて不要だった。
そうすれば1.5のバグっぽい仕様の小細工([:-1])も不要になる。
% echo ちょっと出遅れた | jq -rR '"+----+","| \((./"")[]) |","+----+"' +----+ | ち | | ょ | | っ | | と | | 出 | | 遅 | | れ | | た | +----+
"+----+"が2個出てくるから変数に入れたいとこだが、残念ながらそのほうが長くなる。
% echo ちょっと出遅れた | jq -rR '"+----+"as$s|$s,"| \((./"")[]) |",$s' +----+ | ち | | ょ | | っ | | と | | 出 | | 遅 | | れ | | た | +----+