[ 岡山大学 | 理学部 | 地球科学科 | 地球および惑星大気科学研究室 ]

大気科学演習1

シェルスクリプト

練習問題2ー1

FizzBuzz (フィズバズ)

以下のような感じで表示されたらよい.

1 
2 
Fizz
4
Buzz
Fizz
7 
8 
Fizz
Buzz
11
Fizz
13
14 
FizzBuzz
16
...

とりあえず,20くらいまで表示してみる.

ヒント1

ヒント2

if [ $(( ( i % 3 ) )) -eq 0 ]; then
    echo Fizz
fi

やり方はいろいろ

if [ $(( ( i % 3 )*( i % 5 ) )) -ne 0 ]; then
    echo $i
fi

これを使うと,

#!/bin/bash                                                                     
i=0
while [ $i -lt 20 ]; do
  i=$(( i + 1 ))
  if [ $(( ( i % 3 ) )) -eq 0 ]; then
      echo -n Fizz
  fi
  if [ $(( ( i % 5 ) )) -eq 0 ]; then
      echo -n Buzz
  fi
  if [ $(( ( i % 3 )*( i % 5 ) )) -ne 0 ]; then
      echo -n $i
  fi
  echo
done

ゆっくりにする

もっとたくさん,たとえば100まで表示してみることにする. 普通にスクリプトを書くと一瞬で100まで表示されてしまう. あんまり速いと楽しくないので,sleep というコマンドを使ってみる. sleep は後ろに数字をひとつ書いて使う. 後ろに書いた数字の秒数だけ,処理を停止する. 例えば,

sleep 2

とすると,2秒間停止する(2秒も停止させたら鬱陶しくなるので数字は適当に調整しましょう).

#練習問題2ー1a

世界のナベアツ

3の倍数と3のつく数字ではアホになる.

1 
2 
AHO
4
5
AHO
7 
8 
AHO
10
11
AHO
AHO
14
AHO
16
...

ヒント

変数 text に文字列 word が含まれるかどうか調べる

if [ $( echo $text | grep $word ) ]; then
    echo 'found'
  else
    echo 'not found'
fi


#練習問題2ー2

月の日数を答える

ヒント

echo Enter year
read year
echo Enter month 
read month
if [ $month -lt 1 ]; then
    echo $month is invalid
    exit
fi
if [ $month -gt 12 ]; then
    echo $month is invalid
    exit
fi

グレゴリオ暦

グレゴリウス13世

Gregorius XIII, 1502年1月7日 - 1585年4月10日. 第226代ローマ教皇(在位:1572年-1585年). 1582年にグレゴリオ暦を採用.

グレゴリウス13世(Wikipedia)

#%練習問題2ー2a

曜日判定

cal コマンド

カレンダーを表示する cal というコマンドがあるので,それを使って正しく曜日判定できているかどうか確認することができる.使い方は,

$ cal 12 1867
   December 1867      
Su Mo Tu We Th Fr Sa  
 1  2  3  4  5  6  7  
 8  9 10 11 12 13 14  
15 16 17 18 19 20 21  
22 23 24 25 26 27 28  
29 30 31              

坂本龍馬が暗殺された1867年12月10日は火曜日(当時は曜日とか使ってないので曜日がわかっても意味ないけど).

#%練習問題2ー2b

カレンダー

---------------------------
2020.10
---------------------------
Sun Mon Tue Wed Thu Fri Sat
                      1   2
  3   4   5   6   7   8   9
 10  11  12  13  14  15  16
 17  18  19  20  21  22  23
 24  25  26  27  28  29  30
 31
---------------------------

余談

毎月22日はショートケーキの日.


練習問題2ー3

素数判定

ヒント

#練習問題2ー3a

素数探索

ヒント

#練習問題2ー3b

素因数分解


#%練習問題2ー4

スクリプトに引数 m を渡して,次の数列を計算させる \[ X_{0} = X_{1} = \cdots = X_{m-2} = 0, \ X_{m-1} = 1 \] \[ X_{n+m} = X_n + X_{n+1} + \cdots + X_{n+m-1} \ \ \text{for} \ \ n \ge 0 \]


練習問題2ー5

アメダスのデータから年平均気温を計算する.

/home/atmos/ipesc/sample/amedas

ヒント

y=$( echo $x | awk -F ',' '{print $2}' | awk '{print $1}' )
z=$( echo "$x + $y" | bc )
average=$( echo "scale=2; $sum / $num" | bc )

欠測

1945年の6月と7月の気温は欠測になっている. 1945年のデータを処理するためには,欠測の場合の処理を入れる必要がある.

答え合わせ

2017 15.74
2018 16.32
2019 16.58
2020 16.56
2021 16.46

#練習問題2ー5a

アメダスのデータから日最高気温の年平均を計算する.

ヒント

答え合わせ

2017 21.03
2018 21.58
2019 21.82
2020 21.91
2021 21.84

#練習問題2ー5b

アメダスのデータから日最低気温の年平均を計算する.

ヒント

答え合わせ

2017 11.22
2018 11.80
2019 12.04
2020 11.98
2021 11.81

#練習問題2ー5c

1891年から2021年までの期間について,岡山の年平均気温を計算する.

ヒント

ヒント2

DATADIR=/home/atmos/ipesc/sample/amedas
for YYYY in $( seq 1891 2020 ); do
   DATAFILE=${DATADIR}/Okayama_Okayama_${YYYY}.csv
done

答え合わせ


練習問題2ー6

/home/atmos/ipesc/sample/number/pi100000.txt には円周率の100,000桁が書かれている.0から9の各数字の出現頻度を調べよ.

ヒント

ヒント2(こっちの方が簡単)

ファインマン・ポイント

円周率の小数点以下762桁目から767桁目は「9」が6個連続して並ぶ.これをファインマン・ポイントと呼ぶらしい.リチャード・ファインマンが円周率をこの桁まで暗記したいと言った,とされているためだが,ファインマンがそう言ったかどうかは明らかではないらしい.

ランダム性

円周率の各桁の数字はランダムに現れているように見えるが,乱数列であるとは証明されていない.乱数列であるなら,各数字が出現する確率は等しい.

#練習問題2ー6a

/home/atmos/ipesc/sample/number/e.txt にはネイピア数の50,000桁が書かれている.0から9の各数字の出現頻度を調べよ.

ヒント

$ cut -d ' ' -f 2 /home/atmos/ipesc/sample/number/e.txt

ネイピア数

自然対数の底. 円周率と同格の偉さの数学定数だと思うのだが,円周率に比べると人気がないような気がする? (数学定数の「偉さ」とかいう基準が意味不明ではあるが)


#%練習問題2ー7

文書中で使用されている各アルファベットの使用回数を数える.

/home/atmos/ipesc/sample/text/My_favorite_things.txt
/home/atmos/ipesc/sample/text/Hotel_Mauna_Kea.txt
/home/atmos/ipesc/sample/text/Potential_Vorticity.txt
/home/atmos/ipesc/sample/text/Lorem_ipsum.txt
/home/atmos/ipesc/sample/text/Pangram.txt

ヒント

for char in {a..z}; do
  echo $char
done

infile という名前のファイルに中にある Win を Mac に置き換える

$ sed -e "s/Win/Mac/g" infile

以下のようにすれば削除になる

$ sed -e "s/Win//g" infile

入力はパイプで流し込むことも可

$ cat infile | sed -e "s/Win/Mac/g"

[a-z] は a から z までのいずれかの文字

$ sed -e "s/[a-z]/X/g" infile

[^a-z] は a から z までのいずれかの文字以外

$ sed -e "s/[^a-z]/X/g" infile
$ echo ${word,,}

あるいは

$ echo ${word} | tr A-Z a-z
$ wc -m infile
$ cat infile | wc -m

余談

エドガー・アラン・ポーの有名な小説.下のリンク先を見るとネタバレしちゃうので,これから小説を読むつもりの人は考えてからクリックしてください.




Last Updated: 2022/11/02, Since: 2019/11/07.
This page is generated by Makefile.rd2html.