红联Linux门户
Linux帮助

超级菜鸟求助shell脚本

发布时间:2009-11-20 21:21:21来源:红联作者:crazy52gf
以前从没接触过Linux,更别说shell程序了,但是现在项目组把这个程序交给我,时间还很紧,迫于无奈,到这里来请教各位了。
具体情况如下:
源目录:ods/receive/realtime/standard/
数据文件:S*
TL*
CJ*
IP*
YP*
YW*
check文件:YYYYMMDD*.chk

处理目录:ods/process/realtime/standard/
具体逻辑:
1、将源目录中的check文件排序,然后取YYYYMMDD最早的一批check文件,剪切到处理目录中
2、将处理目录中的所有check文件中包含的的所有详单源文件从源目录中剪切到处理目录中
3、将处理目录中的所有check文件进行分拣:
所有以S打头(包括大小写)的文件,生成local.lst和check_local.txt
所有以TL,CJ打头(包括大小写)的文件,生成long.lst和check_long.txt
所有以IP,YP打头(包括大小写)的文件,生成ip.lst和check_ip.txt
所有以YW打头(包括大小写)的文件,生成yw.lst和check_yw.txt
所有以YW打头(包括大小写)的文件,生成yw.lst和check_yw.txt



样例数据:
check文件:
文件名:20091118103527.chk
结构(即内容): YW2009102711.txt.00.03.81889|2|646|20091118103527
S2009102711.txt.00.03.81889|2|646|20091118103527
TL2009102711.txt.00.03.81889|2|646|20091118103527
第一列就是数据文件的名字即具体逻辑2中提到的详单源文件,第二列指行数,第三列是字符数



check_local.txt样例: local.lst样例:
YYYYMMDD1*|S1*|n1 S1*
YYYYMMDD1*|S2*|n2 S2*
YYYYMMDD1*|S3*|n3 S3*
YYYYMMDD2*|S4*|n4 S4*
YYYYMMDD2*|S5*|n5 S5*
... ...

其中YYYYMMDD1*是check文件的名字,例如20091118103527
S1*和n1分别是check文件的第一列和第二列


请各位帮忙,真的很急,周末还要在家里加班!谢谢了!
有不清楚的地方请说出来,我会解释的。
文章评论

共有 11 条评论

  1. cuidahui521 于 2009-12-11 12:47:58发表:

    太厉害了,我看两遍都没搞明白

  2. cuidahui521 于 2009-12-11 12:47:41发表:

    真强悍

  3. crazy52gf 于 2009-11-22 23:09:11发表:

    谢谢上面两位了啊。
    我是搞ETL的,但是服务器是在unix上,需要一些shell脚本。

  4. zhaoyuzhong3694 于 2009-11-22 08:26:12发表:

    似乎是一组二维表,然后用查询生成视图,我看财务软件中的东东与此很类似。

  5. 一米短绳 于 2009-11-21 22:19:26发表:

    我不知道那个*.chk文件里的第二列:
    ***|2|******
    2是指什么?行数是什么行数…… 难道是指第一列中那个文件一共有2行的意思吗?
    ++++++++++++++++++++++++++++++++++++++++++++++++
    真复杂啊~~ 后面肯定会有脚本继续分析*.txt和*.lst文件,然后前面的*.chk肯定也是某个脚本或者程序产生的分析结果文件…… 我终于体验到啥叫“项目”了……

  6. 一米短绳 于 2009-11-21 22:14:14发表:

    才发现那个chk名字居然是%Y%m%d%h%m%s

    将军高才

  7. zhaoyuzhong3694 于 2009-11-21 20:32:24发表:

    我怎么觉得LZ是搞数据库的……

  8. zhaoyuzhong3694 于 2009-11-21 20:20:58发表:

    [i=s] 本帖最后由 zhaoyuzhong3694 于 2009-11-21 20:35 编辑 [/i]

    >>$(date +%Y%m%d%h%m%s)long.txt

  9. 一米短绳 于 2009-11-21 19:57:11发表:

    将军,能说的详细点儿吗?比如附上一些修改的代码~~

  10. zhaoyuzhong3694 于 2009-11-21 19:50:54发表:

    如果加上cho `date`再将输出定向变为>>附加输入定向,岂不更妙。

  11. 一米短绳 于 2009-11-21 09:38:06发表:

    [code]#!bin/bash
    #关于脚本:
    # 按题目要求,粗略写成,本人菜鸟,写的罗嗦,高手莫笑^_^
    #
    # 祝愿楼主工作顺利,全家幸福!
    #
    #2009-11-21 一米短绳
    #================================================================
    PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
    export PATH

    RTDIR=ods/receive/realtime/standard/
    DNDIR=ods/process/realtime/standard/
    export RTDIR
    export DNDIR
    #以防万一,将执行路径和环境变量先定义好……


    #以下三行是排序并找到“最早”(假如12号和13号,意思是取12号?如果不是这个意思的话
    #就将下面 sort -n 改为 sort -rn即可)的chk文件并剪切到目标目录中……
    first=$(ls -C1 $RTDIR*chk|grep -v '^俺是菜鸟……楼主你别着急 嘿~~~|sort -n|sed -n '1p')
    first=$(echo $first | cut -c -8)
    mv -f $RTDIR$first*.chk $DNDIR


    #移动处理目录中的*.chk中记录的所有在源目录的数据文件到处理目录
    tar -cf tmp.tar `cat $DNDIR*.chk|cut -d '|' -f 1`
    mv tmp.tar $DNDIR
    cd $DNDIR
    tar -xf tmp.tar
    rm -f tmp.tar


    #以下是按照我对楼主您的第三个逻辑的理解而写的……可能我理解有误吧……但愿无误……
    #开始进行分拣
    ls -C1 | grep -i '^S' > local.lst
    ls -C1 | egrep -i '^TL|^CJ' > long.lst
    ls -C1 | egrep -i '^IP|^YP' > ip.lst
    ls -C1 | grep -i '^YW' > yw.lst
    #以上是进行lst文件的创建和写入数据。那个题外话,楼主您题目中多了一句YW那一行吧

    #以下创建txt文件和写入。
    ls -C1 *.chk | cut -d '.' -f 1 >tmp1.txt

    #上面是创建基准文件,做下面tmp2.txt的粘贴目标。
    #开始制作和粘贴各个需要的过渡文件。

    cat *.chk | grep -i '^S'|cut -d '|' -f 1,2 > tmp2.txt
    paste -d '|' tmp1.txt tmp2.txt > check_local.txt

    cat *.chk | egrep -i '^TL|^CJ'|cut -d '|' -f 1,2 >tmp2.txt
    paste -d '|' tmp1.txt tmp2.txt > check_long.txt

    cat *.chk | egrep -i '^IP|^YP'|cut -d '|' -f 1,2 >tmp2.txt
    paste -d '|' tmp1.txt tmp2.txt > check_ip.txt

    cat *.chk | grep -i '^YW'|cut -d '|' -f 1,2 >tmp2.txt
    paste -d '|' tmp1.txt tmp2.txt > check_yw.txt

    #删除临时文件 tmp1和tmp2
    rm -f tmp1.txt tmp2.txt
    [/code]俺是菜鸟……楼主你别着急 嘿~~~