■「第12回本当は怖くないシェル芸勉強会」を解いてみた シェル芸、チョットデキルかも知れない。 【問題と解答例】第12回本当は怖くないシェル芸勉強会 http://blog.ueda.asia/?p=3535 ■Q1 画面にバッテンを描いて下さい。 九九って分かりやすいですよね。 $ for n in `seq 1 9`;do \ for m in `seq 1 9`;do \ if [ $n -eq $m ];then \ echo -n "XX"; \ else \ echo "$m $n" | awk '{if((10-$1)==$2){printf "XX"}else{printf "%02d",$1*$2}}';fi | \ sed s/"[0-9][0-9]"/" "/g | sed s/"XX"/"X"/g; \ done;echo; \ done X X X X X X X X X X X X X X X X X $ for n in `seq 1 9`;do \ for m in `seq 1 9`;do \ if [ $n -eq $m ];then \ echo -n "XX"; \ else \ echo "$m $n" | awk '{if((10-$1)==$2){printf "XX"}else{printf "%02d",$1*$2}}';fi | \ sed s/"[0-9][0-9]"/" "/g | sed s/"XX"/" X"/g; \ done;echo; \ done X X X X X X X X X X X X X X X X X $ for n in `seq 1 9`;do \ for m in `seq 1 9`;do \ if [ $n -eq $m ];then \ echo -n "XX"; \ else \ echo "$m $n" | awk '{if((10-$1)==$2){printf "XX"}else{printf "%02d",$1*$2}}';fi | \ sed s/"[0-9][0-9]"/" "/g | sed s/"XX"/" X"/g; \ done;echo; \ done X X X X X X X X X X X X X X X X X ■余談 普通の九九表。 $ for n in `seq 1 9`;do \ for m in `seq 1 9`;do \ echo "$m $n" | awk '{printf "%3d",$1*$2}'; \ done;echo; \ done 1 2 3 4 5 6 7 8 9 2 4 6 8 10 12 14 16 18 3 6 9 12 15 18 21 24 27 4 8 12 16 20 24 28 32 36 5 10 15 20 25 30 35 40 45 6 12 18 24 30 36 42 48 54 7 14 21 28 35 42 49 56 63 8 16 24 32 40 48 56 64 72 9 18 27 36 45 54 63 72 81 ■Q2 小問1. 次のechoの出力から回文を完成させてください。 $ echo -n $(Xarray=(`echo "たけやぶ" | sed s/"."/" &"/g`); \ for n in `seq 0 $((${#Xarray[*]}-1))`;do \ echo ${Xarray[$n]}; \ done; \ for m in `seq $((${#Xarray[*]}-2)) -1 0`;do \ echo ${Xarray[$m]}; \ done) | tr -d ' ';echo たけやぶやけた ■小問2. 次のファイルの各行について回文を完成させてください。 あ、一般化するの早すぎたw。。。 $ cat kaibun たけやぶ わたしまけ $ cat kaibun | \ for list in `xargs`;do echo -n $(Xarray=(`echo "$list" | sed s/"."/" &"/g`); \ for n in `seq 0 $((${#Xarray[*]}-1))`;do \ echo ${Xarray[$n]}; \ done; \ for m in `seq $((${#Xarray[*]}-2)) -1 0`;do \ echo ${Xarray[$m]}; \ done) | tr -d ' ';echo; \ done たけやぶやけた わたしまけましたわ ■Q3 ウェブ等からデータを取得して南武線の駅名のリストを作ってください。 これで合ってるかどうかは分からない。 $ wget -O - "http://ja.wikipedia.org/wiki/%E5%8D%97%E6%AD%A6%E7%B7%9A" 2>&1 | \ grep "<td><a href=\"/wiki/.*title=" | grep "駅</a></td>\$" | sed s%^.*title=\"%% | \ awk -F\" '{print $1}' | awk '{if(NR%10==0){print $0}else{printf "%s,",$0}}';echo 川崎駅,尻手駅,矢向駅,鹿島田駅,平間駅,向河原駅,武蔵小杉駅,武蔵中原駅,武蔵新城駅,武蔵溝ノ口駅 津田山駅,久地駅,宿河原駅,中野島駅,稲田堤駅,京王稲田堤駅,矢野口駅,稲城長沼駅,南多摩駅,是政駅 府中本町駅,分倍河原駅,西府駅,谷保駅,矢川駅,西国立駅,立川駅,尻手駅,八丁畷駅,川崎新町駅 浜川崎駅,尻手駅,鶴見駅, ■Q4 北から順(正確には都道府県番号順)に並べてください。 順番はISO規格です。 $ cat pref 鹿児島県 青森県 大阪府 群馬県 $ w3m -dump "http://ja.wikipedia.org/wiki/ISO_3166-2:JP" 2>&1 | \ grep "都\|道\|府\|県" | grep -f pref | sed s/".* の旗"//g 青森県 群馬県 大阪府 鹿児島県 ■Q5 各行の数字を大きい順にソートしてください。 $ cat input A 31 1234 -42 4 B 10 31.1 -34 94 $ cat input | while read list;do \ echo -n "$list" | sed s/"[0-9]\|\-\|\."//g; \ echo "$list" | tr -d '[A-Z]' | sed s/" "/"\n"/g | sort -n | xargs echo -n;echo; \ done A -42 4 31 1234 B -34 10 31.1 94 ■Q6 次のファイルについてグラフを作ってください。 $ cat num | \ while read list;do \ echo "$list" | awk '{printf "%2d ",$1}'; \ for n in `seq 1 $list`;do echo -n "*";done;echo; \ done 5 ***** 3 *** 4 **** 10 ********** 2 ** ■Q7 Q6のグラフを次のように縦にしてください。 $ Xarray=(`cat num`); \ for m in `seq 0 12`;do \ for n in $(seq 0 $((`cat num | wc -l`-1)));do \ if [ "${Xarray[$n]}" -gt "$m" ];then \ echo -n " o"; \ else \ echo -n " "; \ fi; \ done;echo; \ done | tac;cat num | xargs echo -n;echo o o o o o o o o o o o o o o o o o o o o o o o o 5 3 4 10 2 ■Q8 次のデータは、何かの試合の結果ですが、各チームが何勝何敗だったかを集計してください。引き分けは無いと仮定して構いません。 $ cat result A-B 1-2 B-A 3-1 C-A 1-0 B-C 5-4 C-B 2-1 $ sed s/"-"/" "/g result | \ awk '{if($3>$4){print $1,"W\n"$2,"L"}else{print $2,"W\n"$1,"L"}}' | \ sort | uniq -c | \ awk '{if ($3=="L"){print $2,$1"負"}else{print $2,$1"勝"}}' A 3負 B 1負 B 3勝 C 1負 C 2勝