Unix全般 -> awk

通算年月日の計算をする

基本編

年間日数の計算

## 2007年〜2009年迄の合計日数計算をする
----------------------------------------------------------------------
echo "" | awk '{n=0;for(y=2007;y<=2009;y++){
                    if(y%4){n+=365}else{n+=366}}{print n}}'
1096
365(2007)+366(2008)+365(2009)=1096となる。
* if(y%4)は閏年は4で割切れ"0"となるのでelseでn(合計)に366が加算される
* 閏年例外(西暦〜1800,1900,2100,2200,2300,2500〜)は考慮しない。
* awk の '' 内はどこでも改行が可能である。
* 最初の echo "" はダミー。入力がないとエラーになるので。
----------------------------------------------------------------------

# (変数値を使用する場合) 
----------------------------------------------------------------------
FROM=2007
TO=2009
echo "" | awk "{n=0;for(y=${FROM};y<=${TO};y++){
                    if(y%4){n+=365}else{n+=366}}{print n}}"
1096
* 変数をawk内で使用する場合は(')でなく(")で囲む。他は同じ。
----------------------------------------------------------------------

1月1日からの通算日数の計算

## 1/1〜12/10迄の通算日数の計算
YY=2008
MM=12
DD=10
echo "" | awk "{if(${YY}%4){i=28}else{i=29};
                n=0;for(m=1;m<${MM};m++)
                    if(m==4||m==6||m==9||m==11){n+=30}
                    else if(m==2){n+=i}
                         else{n+=31}{n+=${DD};print n}}"

345
* 計算する日付をそれぞれ YY,MM,DD 変数に代入する。
* まずその年の閏年をチェックする i に2月の日数を代入する。
* 最後(for外)に日(DD)を加算(n+=${DD})するのでfor文で m<${MM} とする。
* 月(m)=4,6,8,11 の場合30を 月(m)=2の場合(i)を その他は31を加算。
* for文を囲む{}は、付けても付けなくてもどちらでもよい今回は省略。

* システム日付の1/1からの通算日は `date +%j` で表示できる。

1/1からの通算日数からの月日を表示する。

## 1/1から 200日目の月日を表示する。
YY=2008
SUM=200
echo "" | awk "{if(${YY}%4){i=28}else{i=29};
               m=1;d=${SUM};while(1){
                    if(m==4||m==6||m==9||m==11){n=30}
                    else if(m==2){n=i}else{n=31};
                    if(d<=n){break}else{m+=1;d-=n}}
                    {printf \"%02d/%02d\",m,d}}"
07/18
* 計算する日付をそれぞれ SUM,YY 変数に代入する。
* まずその年の閏年をチェックする i に2月の日数を代入する。
* 通算日(d)を月の日数(n)で減産し、その分月(m)を加算する。
* 通算日(d)が、その月の日数(n)以下になった場合forをbreakする。

応用編

年月日の通算日の計算

## 2007/5/1〜2010/12/31迄の通算日数の計算
FR=20070501
TO=20101231

FR_YY=`echo $FR | cut -c 1-4`
FR_MM=`echo $FR | cut -c 5-6`
FR_DD=`echo $FR | cut -c 7-8`
TO_YY=`echo $TO | cut -c 1-4`
TO_MM=`echo $TO | cut -c 5-6`
TO_DD=`echo $TO | cut -c 7-8`

YY_SUM=`echo "" | awk "{n=0;for(y=${FR_YY};y<${TO_YY};y++){
                        if(y%4){n+=365}else{n+=366}}{print n}}"`
FR_SUM=`echo "" | awk "{if(${FR_YY}%4){i=28}else{i=29};
                        n=0;for(m=1;m<${FR_MM};m++)
                        if(m==4||m==6||m==9||m==11){n+=30}
                        else if(m==2){n+=i}
                             else{n+=31}{n+=${FR_DD};print n}}"`
TO_SUM=`echo "" | awk "{if(${TO_YY}%4){i=28}else{i=29};
                        n=0;for(m=1;m<${TO_MM};m++)
                        if(m==4||m==6||m==9||m==11){n+=30}
                        else if(m==2){n+=i}
                             else{n+=31}{n+=${TO_DD};print n}}"`
expr $YY_SUM + $TO_SUM - $FR_SUM
1340
* 開始年月日を変数 FRに、終了年月日を変数 TOに代入する。
* 開始年から終了前年の年通算日数を計算し、変数 YY_SUM に代入する。
* 開始年の年通算日を計算し、変数 FR_SUM に代入する。
* 終了年の年通算日を計算し、変数 TO_SUM に代入する。
* 最後に YY_SM + 終了年通算日(TO_SUM) - 開始年通算日(FR_SUM)を計算。
      Document-Folder          一覧
HP-UX
HULFT
JAVA
JP1
JavaScript
Linux
MAC
PHP
Perl
Python
Ruby
SOA
Solaris
Unix全般
Windows
XML
エクセル
スタイルシート
セキュリティー
データベース
ネットワーク
パソコン
ブラウザ
プログラム構文
仮想化
          RSS-Folder
ニュース
   アットマーク・アイティ(@IT)
   シンクイット(ThinkIT)
   インターネットコム
   インターネットウォッチ
   日経IT-Pro
   日経パソコン
   CNET Japan
   ZD-NetJapan
   MYCOM
   RBB-Today
ベンダー
   日本IBM
   日本HP
   サンマイクロシステムズ
   NEC
   富士通
   日立
ソフトウェア
   マイクロソフト
   トレンドマイクロ
   オラクル
   サイボウズ
   Mozilla
   野村総合研究所
   (その他ソフトウェア企業)
更新履歴 一覧
 07/08 PERF
プログラム構文
 07/07 PERF
プログラム構文
 06/25 オブジェクトプログラミング2
Perl>サンプル
 07/12 クローン作成
仮想化>vCenter
 07/12 vyatta設定
ネットワーク>vyatta
 07/12 vyattaインストール
ネットワーク>vyatta
 07/12 リポジトリサーバ
Linux>サーバ構築
 07/05 VMwareのインストール
仮想化>VMware
 07/05 PXEブート
仮想化>KVM
 07/01 DHCPでのPXEブート
仮想化>KVM
 06/27 qcow2仮想DISK作成
仮想化>KVM
 06/13 NWの設定
仮想化>VMwareEsxi
 06/13 IPアドレスの変更
仮想化>VMwareEsxi
 06/12 自動ssh
Unix全般>シェル>Bash
 06/12 diffプログラミング
Python
Google