用awk统计表中值为null的项目

【需求】
    在项目测试阶段,需要将所有表中值为null的字段抽取出来并进行统计。
【Solution】
    由于DB2部署在AIX系统上,可以在shell环境下编写awk脚本程序对表扫描,抽取出对象字段。
【shell程序】
getNullItem.sh

#! /usr/bin/ksh

db2 connect to D3703H0 user d3703bth using d3703bth
db2 set current schema = DB2I3703

echo `date` > Output
for i in `cat tablelist`; do
   db2 "describe table "$i | grep "はい"> itemIn.txt
   awk 'BEGIN{ printf ("select ") > "sqlOut" }{ printf ("count(*) - count(%s) as %s件数,", $1, $1)>> "sqlOut" }' itemIn.txt
   echo "count(*) from "$i >> sqlOut
  
   echo $i >> Output
   db2 `cat sqlOut` >> Output
done
echo `date` >> Output
-------------------------------------------------------------------------
上述程序中,cat tablelist是显示保存于文本文件tablelist中的表名,如下:
【tablelist】
T37A00F1
T37A00F2
T37A00F5
T37A00M9
T37A00MB
T37A00MC
T37A00MD
T37A00ME
T37A00MF
T37A00MG
......

最后,Output文件里的输出如下所示:
【Output】

Mon Feb 2 17:11:08 JST 2009
T37A00F1

HU1N6件数   KA4ZS件数   KA4ZT件数   RE0BK件数   KA4ZN件数   SI0D2件数   SI2UD件数   KI02F件数   KO00N件数   KO01A件数   11        
----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- -----------
          0           0           0           0           0           0           0           0           0           0          31

  1 レコードが選択されました。

T37A00F2

HU1N6件数   HU1MT件数   HU1OK件数   4         
----------- ----------- ----------- -----------
          0           0           0           0

  1 レコードが選択されました。

T37A00F5

1         
-----------
          0

  1 レコードが選択されました。

T37A00M9

SI2B9件数   KA08P件数   MI0H4件数   TO19V件数   SI44Q件数   SI0X6件数   7         
----------- ----------- ----------- ----------- ----------- ----------- -----------
          0           0           0           0           0           0           0

  1 レコードが選択されました。

T37A00MB

1         
-----------
       1911

  1 レコードが選択されました。
-------------------------------------------------------------------------
【awk程序】
processOutput.awk

#!/bin/awk -f

BEGIN {
  #テーブル名
  tableName = "";
  #件数出力行の計数
  counter = 0;
  #項目名Array
  itemName[1] = "";
}
{
  if (NR == 1) {
    print "GAIN DBテーブルにはNULLを含める項目がまとめて表示:" > "Output2";
    print $0, "\n\n" >> "Output2";
  } else if (match($0, /:/) != 0) {
    print $0 >> "Output2";
  } else {
    if (match($1, /T37A00/) != 0) {
      #テーブル名取得
      tableName = $1;
    }
   
    if (match($1, /件数/) != 0) {
      #項目名取得
      for (i = 1; i <= NF - 1; i ++) {
        itemName[i] = $i;
      }
    }
   
    if (NR == 8 * counter + 6) {
      #件数値取得処理
      for (i = 1; i <= NF - 1; i ++) {
        if ($i != 0) {
          hasValue = 1;
          break;
        }
      }
     
      if (hasValue == 1) {
        printf "%s\n\n", tableName >> "Output2";
        for (i = 1; i <= NF - 1; i ++) {
          if ($i != 0) {
            printf "%s   ", itemName[i] >> "Output2";
          }
        }
        firstItem = 0;
        for (i = 1; i <= NF - 1; i ++) {
          if ($i != 0) {
            if (firstItem == 0) {
              printf "\n----------  " >> "Output2";
              firstItem ++;
            } else {
              printf "----------  " >> "Output2";
            }
          }
        }
        firstItem = 0;
        for (i = 1; i <= NF - 1; i ++) {
          if ($i != 0) {
            if (firstItem == 0) {
              printf "\n%9s   ", $i >> "Output2";
              firstItem ++;
            } else {
              printf "%9s   ", $i >> "Output2";
            }
          }
        }
        print "\n\n" >> "Output2";
      }
     
      hasValue = 0;
      counter ++;
    }
  }
}
------------------------------------------------------------------------
输出结果如下:
【Output2】

GAIN DBテーブルにはNULLを含める項目がまとめて表示:
Mon Feb 2 17:11:08 JST 2009

T37A00MF

ME0A8件数  
---------- 
    14419  


T37A00MG

ME0A8件数   EE0QJ件数   KA4ZQ件数   ME0KS件数   HE0CE件数   SO0UD件数   TO1A6件数   HU1NL件数   HA0RM件数  
----------  ----------  ----------  ----------  ----------  ----------  ----------  ----------  ---------- 
     1888           2        1888        1888        1888        1888        1888        1888        1888  


T37A00MW

KU026件数   WA03J件数   HA01E件数   KE1NR件数   KA07B件数   TA10K件数   HA045件数  
----------  ----------  ----------  ----------  ----------  ----------  ---------- 
      294         294         294         294         294         294         294  


T37A00S3

KO1N6件数  
---------- 
     4252  


T37A00S6

HU1MJ件数   HU1MK件数   HU1ML件数   HU1MM件数   HU1MN件数   AA01A件数   SI0D2件数   SI2UD件数  
----------  ----------  ----------  ----------  ----------  ----------  ----------  ---------- 
     1795        1795        1795        1795        1795        1795        1789        1789  

posted on 2009-04-24 13:56 koradji 阅读(678) 评论(0)  编辑  收藏 所属分类: awk


只有注册用户登录后才能发表评论。


网站导航:
 
<2009年4月>
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789

导航

统计

常用链接

留言簿(2)

随笔分类

随笔档案

文章分类

文章档案

收藏夹

db2

dos

Groovy

Hibernate

java

WAS

web application

搜索

最新评论

阅读排行榜

评论排行榜