labunix's blog

labunixのラボUnix

「jus & USP友の会共催 シェルワンライナー勉強会@関西(第11回シェル芸勉強会)」を解いてみた。

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