何日か経ちましたし、もういいですよね……
課題
お題:ゴールデンウイークシェル芸問題 | 上田ブログ
1から100まで数字が書いてあるansというファイルを作り、ansの中から素数でない数をワンライナーだけで消し去ってください。(ansの中身を書き換えるということです。forもwhileもなしで、コマンドはパイプでつないで。)
% seq 100 > ans
はじめの回答
% cat ans | factor | sed 's/://g' | awk 'NF==2{print $1}' | cat > ans
課題
awkのバッファリングに依存しており、問題の100件程度では問題ないのですが、件数が多くなると壊れます。
% seq 100000 > ans
% tail ans
13367
13381
13397
13399
13411
13417
13421
13441
13451
13
また、Cシェル系(csh/tcsh/zsh)ではうまくいきましたが、Bシェル系(sh/Bash)ではうまくいきませんでした。
別解
TL上には様々な解が出ていましたが、自分はヒアドキュメントを生成して評価する、という手法で解決しました。
cat ans | factor | sed 's/://g' | awk 'BEGIN{print "cat <<EOS>ans"}NF==2{print $1}END{print "EOS"}' | sh
こちらはcsh/tcsh/zsh/sh/Bashで確認済みです。
※模範解答は moreutilsの sponge コマンド使うやつですよね