トップ «前の日記(2012-11-14(Wed)) 最新 次の日記(2012-11-16(Fri))» 編集

屑俺日記

僕の備忘録(PC、UN*X、ネットワーク関連が中心)なんです。
自分の書いたところは適当(な時とか)に書き換えますので御了承を。


2012-11-15(Thu) 気温が十度くらいになり、朝、にわか雨

fizzbuzz

まず第一作。
awk にしては冗長な気がするが。

#!/usr/bin/env awk
BEGIN { 
for(x=1; x <= 16; x++) {
  if(x%15==0) { foo = "fizzbuzz" }
  else if(x%5==0) { foo = "buzz" }
  else if(x%3==0) { foo = "fizz" }
  else foo=x 
  print foo
  }
}

もう少し凝ってみた。適当に改行したから、少し多く見える。
もちろん結果は同じ。

#!/usr/bin/env awk
BEGIN {
for(x=1; x <= 16; x++) {
  x%15 ? \
    (x%5 ? \
      (x%3 ? y=x \
        : y="fizz") \
          : y="buzz")  \
            : y="fizzbuzz"
  print y
  }
}
$ awk -f fb.awk 
1
2
fizz
4
buzz
fizz
7
8
fizz
buzz
11
fizz
13
14
fizzbuzz
16

if?true:false

真偽がなんか逆になったみたい。

#!/usr/bin/env awk
BEGIN { 
for(x=1; x <= 5; x++) {
  x%2 ? foo="奇" : foo="偶"
  print x,foo "数"
  } 
}
$ awk -f bin.awk 
1 奇数
2 偶数
3 奇数
4 偶数
5 奇数

mawk と gawk(2)

#!/usr/bin/env awk
BEGIN{
10 - 10 ? \ 
 foo = "not zero" \ 
  :  foo = "zero"
print foo
}
 
=> zero

行末の¥もしくはバックスラッシュについて。
gawk では、 最初のバックスラッシュ ("?" の後ろ)を省略できたが、mawk と FreeBSD10.0-CURRENT のawkでは 省略できなかった。
ちなみに、 二つめのバックスラッシュ (":" の前) は、いずれも省略できなかった。

$ uname -a
FreeBSD $HOST 10.0-CURRENT FreeBSD 10.0-CURRENT #0: \
  Tue Nov 13 16:44:34 JST 2012     \
  root@$HOST:/usr/src/sys/amd64/compile/third  amd64
 
$ awk --version
awk version 20110810 (FreeBSD)

もう一発

文字列の比較、そして配列作成。

#!/usr/bin/env awk
BEGIN {
foo="f"
n = split("e  g  E  G  1  100",  bar, " ")
for(i=1; i<=n;i++) {
  foo > bar[i] ? baz="larger" : baz="smaller"
  print foo " is " baz " than " bar[i] }
}
=>
f is larger than e
f is smaller than g
f is larger than E
f is larger than G
f is larger than 1
f is larger than 100

mawk, gawk とも同じ。
split() は、 AWKによる本にも 載ってはいた(P261,etc)が、ちゃんと 読まないと分からない。
sedとawkの本は、ちゃんと読まなくても 配列の生成方法として、セクションが 一つ割り当てられている(8.4.4)ことが すぐ分かった。


リンクはご自由にどうぞ。でもURLや内容が変った場合はあしからず。

index.htmlは ここから。