■「jus & USP友の会共催 シェルワンライナー勉強会@関西(第11回シェル芸勉強会)」を解いてみた。 関西に行けない程度の幽霊会員です。(まだ会員なのかも怪しい。。。) http://www.slideshare.net/ryuichiueda/20140614-jus-uspstudy?ref=http://blog.ueda.asia/?page_id=684 ■問題1 次の echo の出力を、echo にパイプをつなげて 足し算してください。 「$␣echo␣-12,135,123␣135,123␣135,123」 ■clispで回答。 $ echo -12,135,123 135,123 | \ sed s/,//g | sed s/^/"(+ "/ | sed s/"\$"/")"/ | clisp -q | tail -1 -12000000 ■問題 2 次のメモについて、各レコードが「名前 点数」の 順になるようにデータを整形しましょう。 $ cat score 45 蒲田 濱田 72 今泉 84 24 上田 94 斎藤 ■満点が分かるなら、awkで。 $ awk '{if(100>=$2){print}else{print $2,$1}}' score 蒲田 45 濱田 72 今泉 84 上田 24 斎藤 94 ■問題 3 m/s に直してください。 1 マイル = 1.609km で演算を $ cat speed 100km/h 16mph ■おっと分数だった。。。 $ grep -v "^\$" speed | sed s%"km/h"%" (/ 1000 3600))"% | sed s%"mph%(/ 1609 3600))"% | \ sed s/^/"(* "/g | clisp -q | grep -v "^\[" 250/9 1609/225 $ grep -v "^\$" speed | sed s%"km/h"%" (/ 1000.0 3600))"% | sed s%"mph%(/ 1609.0 3600))"% | \ sed s/^/"(* "/g | clisp -q | grep -v "^\[" 27.777779 7.151111 ■問題 4 さいとうさん、さわださん、ひろたさん、いとうさんの数を 数えてください。 $ cat name 斎藤 齊藤 沢田 澤田 伊藤 齋藤 斉藤 広田 廣田 濱田 ■地道に。 $ cat name | sed s/"[斎斉齋齊]藤"/"さいとう"/g | \ sed s/"[沢澤]田"/"さわだ"/g | \ sed s/"伊藤"/"いとう"/g | \ sed s/"[広廣]田"/" ひろた"/g | \ sed s/" "/"\n"/g | grep -v "^\$\|濱田" | sort | uniq -c 1 いとう 4 さいとう 2 さわだ 2 ひろた ■問題 5 次の CSV に書いてある数字を足し算してください。 $ cat csv 1,2,"123,456",-5,"-123,444" 6,7,8,"12",9 ■カンマ付きのダブルクォーテーション内を先に処理して。 $ sed s/"\"\([-0-9]*\),\([0-9]*\)\""/"\1\2\n"/g csv | sed s/"\"\|,"/"\n"/g | awk '{sum+=$1};END{print sum}' 52 ■問題 6 次のデータを行列として転置してください。 $ cat matrix a b c d e f g h i ■配列にいれちゃえ。 $ array=(`cat matrix | tr '\n' ' '`);for n in `seq 0 2`;do echo ${array[$n]} ${array[$n+3]} ${array[$n+6]};done a d g b e h c f i ■問題 7 次の IPv6 の IP アドレスから、 省略された 0 を復元してください。 4 桁の頭のゼロは省略できる $ echo 2001:db8:20:3:1000:100:20:3 ■一回、10進数に戻しますか。。。 $ echo 2001:db8:20:3:1000:100:20:3 | \ sed s/":"/"\n"/g | for n in `xargs`;do echo $((0x${n})) | awk '{printf "%04x:",$0}';done | sed s/"\:\$"/"\n"/ 2001:0db8:0020:0003:1000:0100:0020:0003 ■問題 8 次の IPv6 の IP アドレスから、 省略された 0 を復元してください。 4 桁の頭のゼロは省略できる 1 回だけ $ cat ipv6 2001:db8::1234:0:0:9abc 2001:db8:20:3:1000:100:20:3 2001:db8::9abc ■可変長はループの方が良いのでしょうけど。。。 $ for list in `cat ipv6`;do \ echo "$list" | sed s/"::"/":0:"/g | \ awk -F\: 'OFS=":"{if(NF<8&&NF>6) \ {print $1,$2,$3,$4,$5,$6,"0000",$NF} \ else{if (NF<5) \ {print $1,$2,$3,"0000:0000:0000:0000:",$NF} \ else{print}}}' | \ sed s/":"/"\n"/g | for n in `xargs`;do echo "$((0x${n}))" | \ awk '{printf "%04x:",$0}';done | sed s/"\:\$"/"\n"/; \ done 2001:0db8:0000:1234:0000:0000:0000:9abc 2001:0db8:0020:0003:1000:0100:0020:0003 2001:0db8:0000:0000:0000:0000:0000:9abc