以前从没接触过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文件的第一列和第二列
请各位帮忙,真的很急,周末还要在家里加班!谢谢了!
有不清楚的地方请说出来,我会解释的。
cuidahui521 于 2009-12-11 12:47:58发表:
太厉害了,我看两遍都没搞明白
cuidahui521 于 2009-12-11 12:47:41发表:
真强悍
crazy52gf 于 2009-11-22 23:09:11发表:
谢谢上面两位了啊。
我是搞ETL的,但是服务器是在unix上,需要一些shell脚本。
zhaoyuzhong3694 于 2009-11-22 08:26:12发表:
似乎是一组二维表,然后用查询生成视图,我看财务软件中的东东与此很类似。
一米短绳 于 2009-11-21 22:19:26发表:
我不知道那个*.chk文件里的第二列:
***|2|******
2是指什么?行数是什么行数…… 难道是指第一列中那个文件一共有2行的意思吗?
++++++++++++++++++++++++++++++++++++++++++++++++
真复杂啊~~ 后面肯定会有脚本继续分析*.txt和*.lst文件,然后前面的*.chk肯定也是某个脚本或者程序产生的分析结果文件…… 我终于体验到啥叫“项目”了……
一米短绳 于 2009-11-21 22:14:14发表:
才发现那个chk名字居然是%Y%m%d%h%m%s
将军高才
zhaoyuzhong3694 于 2009-11-21 20:32:24发表:
我怎么觉得LZ是搞数据库的……
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
一米短绳 于 2009-11-21 19:57:11发表:
将军,能说的详细点儿吗?比如附上一些修改的代码~~
zhaoyuzhong3694 于 2009-11-21 19:50:54发表:
如果加上cho `date`再将输出定向变为>>附加输入定向,岂不更妙。
一米短绳 于 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]俺是菜鸟……楼主你别着急 嘿~~~