■「第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勝