存档

文章标签 ‘shell’

Set Default Value on Shell

2011年6月22日 评论已被关闭

#!/bin/sh
# v_test.sh
# by 2hei.net  06/22/2011
#
#get param from command line
fisr_param=$1
second_param=$2

#set default value when null
fisr_param=${fisr_param:=”First”}
second_param=${second_param:=”Second”}

#print values
printf “fisr_param:\t”$fisr_param”\n”
printf “second_param:\t”$second_param”\n”

Run script…
#no params
[localhost]$sh v_test.sh
fisr_param:        First
second_param:  Second

#add params
[localhost]$sh v_test.sh hello baby
fisr_param:        hello
second_param:  baby

分类: shell 标签:

a script of awk array – just mark

2010年9月6日 评论已被关闭

Just mark it. 🙂

#!/bin/sh
awk -F”_t_7_Y_” ‘{if($1==1) {printf $2; for(i=3;i<=NF;i++) if(i==NF) print $i;else printf $i}}’ temp1  > 1.txt
awk -F”_t_7_Y_” ‘{if($1==2) if($2 in S22){S22[$2]=$2;S23[$2]=$3″ “S23[$2];N2[$2]++}else {S22[$2]=$2;S23[$2]=$3;N2[$2]=1;} if($1==3) if($2 in S32){S32[$2]=$2;S33[$2]=$3″ “S33[$2];N3[$2]++}else {S32[$2]=$2;S33[$2]=$3;N3[$2]=1;} if($1==4) if($2 in S42){S42[$2]=$2;S43[$2]=$3″ “S43[$2];N4[$2]++}else {S42[$2]=$2;S43[$2]=$3;N4[$2]=1;} }END{for(i in S22) print S22[i],N2[i],S23[i]>>”2.txt”;for(i in S32) print S32[i],N3[i],S33[i]>>”3.txt”; for(i in S42) print S42[i],N4[i],S43[i]>>”4.txt”;}‘ temp1

awk ‘NR==FNR {for(i=2;i<=NF;i++) S[$1]=S[$1]” “$i;}NR>FNR{print $0” “S[$1]}’ 2.txt 1.txt > t1.txt
awk ‘NR==FNR {for(i=2;i<=NF;i++) S[$1]=S[$1]” “$i;}NR>FNR{print $0” “S[$1]}’ 3.txt t1.txt > t2.txt
awk ‘NR==FNR {for(i=2;i<=NF;i++) S[$1]=S[$1]” “$i;}NR>FNR{print $0” “S[$1]}’ 4.txt t2.txt > final.txt

分类: shell 标签:

计算1970到今天的天数的shell脚本

2008年10月7日 评论已被关闭

#!/bin/bash
#得到1970年到今天的累计天数

get_day()
{
  Begin_Year=1970
  TO_Year=`date +%Y`
  L=`expr $TO_Year – $Begin_Year`
  To_Mon=`date +m%d`
  To_day=`date +%j`
  nu=1
  all_day=0
  while [ $nu -le $L ]
  do
    Y=`expr $Begin_Year + $nu`
    is_runnian=`expr $Y \% 4`
    if [ $is_runnian -eq 0 ]
    then
      day_nu=366
    else
      day_nu=365
    fi
    nu=`expr $nu + 1`
    all_day=`expr $all_day + $day_nu`
  done
  echo `expr $To_day + $all_day`
}

分类: shell 标签:

shell 的变量作用域

2008年7月8日 评论已被关闭

shell变量的作用域
while read line
  do
    str[$i]=$line1
    echo $i
    echo ${str[i]}
    let i=i+1
  done  < data
 
  len=${#str[@]}
  echo $len
 
  $len长度为实际data文件的行数
  str[]变量的作用域一直有效
  ===================
  cat data|while read line
  do
    str[$i]=$line1
    echo $i
    echo ${str[i]}
    let i=i+1
  done
 
  len=${#str[@]}
  echo $len
 
  $len长度为0
 
  说明str[]变量的作用域到done结束即失效。
 
  原因是局部变量是普通的变量,仅在创建它的Shell中有效。
   cat data|while read line  使用了管道符 “|”
  表明父shell中的局部变量不会传递到子shell中

分类: OpenSource, shell 标签:

Shell中标准输出重定向

2008年6月13日 评论已被关闭

Shell中标准输出重定向

例子:

把错误和输出都重定向到out.txt中
ls -l a.pro > out.txt  2>&1

把错误重定向到文件out.txt中
ls -l a.pro 2>out.txt

更多操作:
command > filename 把把标准输出重定向到一个新文件中
command >> filename 把把标准输出重定向到一个文件中(追加)
command 1 > fielname 把把标准输出重定向到一个文件中
command > filename 2>&1 把把标准输出和标准错误一起重定向到一个文件中
command 2 > filename 把把标准错误重定向到一个文件中
command 2 >> filename 把把标准输出重定向到一个文件中(追加)
command >> filename 2>&1 把把标准输出和标准错误一起重定向到一个文件中(追加)
command < filename >filename2 把command命令以filename文件作为标准输入,以filename2文件作为标准输出
command < filename 把command命令以filename文件作为标准输入
command << delimiter 把从标准输入中读入,直至遇到delimiter分界符
command <&m 把把文件描述符m作为标准输入
command >&m 把把标准输出重定向到文件描述符m中
command <&- 把关闭标准输入

分类: shell 标签: ,

oracle sqlldr 实际运用中的几个问题

2008年3月22日 评论已被关闭

以前也一直在用sqlldr进行oracle的数据导入工作,但由于数据表结构比较简单,数据格式比较规范,所以简单的脚本即可完成任务,没有仔细的进行研究。

最近因为项目需要,要处理一个稍微复杂一点的表,涉及到日期字段,还有自增序列,字段比较复杂不规则,有很多空列,经过一番研究后,终于搞定,特此总结一下。

1. 空字段处理: TRAILING NULLCOLS   但是整行不能全空,否则整行无法插入
2. 日期字段处理:格式化处理 AddDate “to_date(:AddDate,”’yyyy-mm-dd hh24:mi:ss”’)”
3. 自定义字段分割符 “|”
4. 采用触发器来处理自增字段,具体的建立方法可参考我的另一篇关于触发器的介绍带有条件的触发器trigger

ldr脚本如下:

vi sql.ctl    

LOAD DATA
INFILE ‘/home/oracle/data/table.data’
APPEND INTO TABLE table
fields terminated by ‘|’
TRAILING NULLCOLS

(
ID,
USERNAME,
PASSWORD,
AddDate “to_date(:AddDate,”’yyyy-mm-dd hh24:mi:ss”’)”
)

数据文件样式  table.data

|test|test|2008-03-20 18:09:10

|2hei|2hei|2008-03-20 18:09:10

|admin|admin|2008-03-20 18:09:10

 

loader 脚本运行方式:

切换到oracle用户  su – oracle

或者root下执行 su -l oracle -c “sqlldr userid=2hei/2hei control=/home/oracle/data/sql.ctl log=/home/oracle/log/sql.log bad=/home/oracle/log/bad.log”

执行后可以查表,看看字段的插入情况。

如果有问题可以看执行后的log 或者 bad文件。

 

 

分类: database 标签: , ,

China 省份,城市三级联动数据库

2008年1月24日 评论已被关闭

首先声明这个数据是从网上搜集,源自一个access数据库表。因为很少用到access,

所以把其中数据提出后,用shell脚本替换成一个以“,”分隔的文本文件。

包括省份、城市、区划、城市英文缩写。

这样可以建好表结构后,可以方便导入到oracle、mssql或者mysql中。

详细内容在下面的文本文件中:

city_sql.txt

 

关联的规则为:

—————————————————————

河北,Hebei Sheng,130000,HE

唐山市,Tangshan Shi,130200,TGS

滦南县,Luannan Xian,130224,LNJ

—————————————————————

第三栏为最后四位为‘0000’的是省级单位,全国一共31个,

第三栏为最后两位为‘00’且不是‘0000’的是地市单位,并且与省级单位的前两位相同,如:‘13’

第三栏最后两位既不是‘00’最后四位也不是‘0000’的是三级单位,或是区,或是县级市,

属于与他前四位相同的地级城市,如:‘1302’。

这样在一个表中可以体现出行政区划的三级数据。

 

分类: OpenSource 标签: , , ,