当前位置: 技术问答>linux和unix
求shell 高手。。。!!!
来源: 互联网 发布时间:2017-02-03
本文导语: 新手能看懂shell 求高手帮忙写一下。。 有一个目录,下面有很多文件。文件名格式固定。如: D20120208.05_20120208.06_DAA D20120208.06_20120208.07_DAA D20120208.07_20120208.08_DAA D20120208.05_20120208.06_BOD D20120208.06_20120208.07_BOD D20120208.07_20120208.08...
新手能看懂shell 求高手帮忙写一下。。
有一个目录,下面有很多文件。文件名格式固定。如:
D20120208.05_20120208.06_DAA
D20120208.06_20120208.07_DAA
D20120208.07_20120208.08_DAA
D20120208.05_20120208.06_BOD
D20120208.06_20120208.07_BOD
D20120208.07_20120208.08_BOD
文件里面有许多字段,每一种业务类型有不同的字段,比如说 DAA里面有name,age,sal。 BOD里面有name,age,sess。
现在传入一个文件名,和某些字段。比如说 D20120208.05_20120208.06_DAA,name,age。
就需要解析所有DAA类型的文件以及查询name,age字段,需要计算age字段。
解析每一个文件需要记录日志,该文件已经被解析过了。并且输出一个文件里面有name,age字段(文件名不变,存放
在另一目录)。
如果输入了 D20120208.05_20120208.06_DAA,name,age,07。
需要解析 07 点以前的文件,如果已经被解析过,就不需要解析了。输入参数的长度不会超过10个。
求高手挑战一下,帮帮小弟,刚刚学习shell。谢谢。
|
根据楼主的描述,
假设数据文件D20120208.05_20120208.06_DAA如下:
D20120208.08_20120208.09_DAA 如下
脚本如下:
执行效果如下:
假设数据文件D20120208.05_20120208.06_DAA如下:
name age sex wage
liu 25 male 3456
zhang 27 female 4567
D20120208.08_20120208.09_DAA 如下
name age sex wage
ma 26 male 3856
sun 26 female 4667
脚本如下:
#!/bin/sh
parse()
{
echo $file |tee -a parsed
awk -v cols="$args" '
BEGIN {
}
NR==1 {
for (i=1;i 0)
field[i]=$i
}
}
{
for (i in field)
printf ("%s t", $i)
printf("n")
}' $file
}
args=$*
if echo $args | grep -q " *[0-9][0-9] *$"; then
file=${args%% *}
time=${args##* }
args=${args#* }
args=${args% *}
for file in $(ls); do
f2=$(echo $file|awk -F[._] '{print $2}')
f4=$(echo $file|awk -F[._] '{print $4}')
echo $f2 | grep -q "^[0-9][0-9]$" || continue
echo $f4 | grep -q "^[0-9][0-9]$" || continue
if [ $f2 -lt $time -a $f4 -lt $time ]; then
if ! grep -q "$file" parsed; then
parse |tee -a result
fi
fi
done
else
file=${args%% *}
args=${args#* }
if ! grep -q "$file" parsed; then
parse |tee -a result
fi
fi
执行效果如下:
# ./parse.sh D20120208.05_20120208.06_DAA name sex 10
D20120208.05_20120208.06_DAA
name sex
liu male
zhang female
D20120208.08_20120208.09_DAA
name sex
ma male
sun female