一撃このwebサイトの先進的な機能は、ブラウザーのJavaScriptを有効にする必要があります。1件のコメントTweetみなさんこんばんは。前回こちらの記事を書いたら殊の外Twitterでの反響がありましたので、別解をまとめてみたいと思います。別解をいただいたので追記しました。最後に明日のシェル芸勉強会の宣伝をしようと思ったのですが、書いてて結構自分で盛り上がって長いエントリーになってしまったので、最初に書いておきます。懇親会(#!/beer/bash)を行いますので、ダラダラと盛り上がることができます。シェル芸の醍醐味の1つに、正解が1つじゃないという面白みがあるのですが、今回Twitterで実によいコラボレーションができたと思います。何か1つワンライナーができたら、もっと違うアプローチがあるのでは?もっとパイプの本数を減らせないか?冗長な処理が削れないか?というチャレンジをするのは非常に勉強になりますね。元のお題は「100行の空行を出力する」というシェル芸でした。こちらではseqコマンドで1から100を出力したものをsedやawkで空文字に置換するものでしたが、Twitterでは別のコマンドでやってみた方たちからリプライをいただきました。2014こちらはシンプルに、yesコマンドで空文字を出力し、headで100行ぶん切り出すというものです。正規表現で置換する必要がなく、シンプルですね。性器表現で痴漢、アカン!次にレスポンスがあったのがこちらになります。変化球的なやつを考えました。100」と横に表示される数字を見事に縦にしています。cutコマンドで5文字目を表示するとしていますが、こうすることで空行として表示されることを狙っているのですね。{1..100}"n"」)だけで実行するとわかるのですが、先頭にスペースが入っているので、1行の最大文字が4文字なのです。私ももう1捻りしてみました。お!その発想はなかったです。2014100行の何かを出力するのに、lsの結果を使ってみました。-l1895ご覧の通り1895ものファイルがあったので、headで100行切り取りました。今度は1行の最大文字数を超えるぶんを表示しようということで、cutコマンドにパイプで渡しました。どちらでも構いません。ファイル名の最長文字数が35文字だったので、36文字目以降を表示するか、36文字目を表示するかの違いだけで、いずれも空行が表示されるようになっています。このようなレスがつきました。/binって100個もあったんですね。'n'もう一つ作ってみました。2014さきほどのechoの応用で、すべての文字を改行に置換していますね。yesやechoやls以外に何か新ネタを披露せねば・・・と焦って作ったシェル芸がこちらです。今度は冗長なのになってしまいました。.」で縦に並べ替えてからsedで空行に置換しています。閃いてあまり考えずに実行したので、Twitterに投稿してから「これもうちょっと短くできないとカッコ悪いなぁ・・・」と思ってしまいました。自己レスしたのがこちらです。2014もう単純にurandomの出力をいきなり改行に置換して、100行でぶった切ってます。最初からこうすればよかった。シェル芸力のなさっぷりを発揮してしまいました。OSXでは使えないようで・・・。2014そこはさすがPOSIXおじさん、awkだけでパイプを1本も使わずに解決してしまいました。2014forを使うから遅いかなとか思ってしまってごめんなさい。シェルのforを使うと遅いのですが、awkのforを使うと、むしろ先のurandomを使うより速かったです。計測結果は以下の通りです。0m0.002sちなみに、シェルのforとawkのforでどれだけ実行時間に差があるか計測してみました。100行ぽっちだとシェルの方が速いくらいですが、これが1000000行ですと差は歴然です。0m0.003sたまげたなぁ。パイプを通るから遅いのかと思って、シェルのfor文だけで再計測してみましたが、こんな感じでした。0m0.323s以上のことから、シェルのforは遅い(forに与えた条件がすべて終わってはじめて全体の終了だから当たり前ですが)ということになるようです。awkのforがこうならずに速いメカニズムについては、awk神さいとうさんの降臨を待ちたいところですが、きっと今頃鳥取のシェルスクリプトワークショップの準備でお忙しいことかと思われますので、今度お会いしたときに聞いてみたいと思います。このお題をやろうと決めたときから、私ははなからシェルのforとwhileは使わないと心に決めていました。whileの禁止」、「コマンド単騎使用の禁止」等が有名である。書いているようですが、本当にこれ理由があってやっていることなんです。2014こちらは単純にechoで空文字(改行つき)をprコマンドに渡して100行にしています。for文との比較速度については僕も気になっていたのでスッキリしました。2014さらに別解いただきました。いかがでしたでしょうか?たかだか「100行の空行を表示する」だけのシェル芸でもこれだけの解があり、しかも実行するコマンドによっては速度差が歴然だったりします。思いついていないだけで他にも解があるでしょうし、こうして解のパターンを考え、しかもその理由を人に説明できれば、相当なスキルがつくはずです。週末にでもお題を決めてトライしてみてください。