脚本初步原型:具体应用可自行修补
[root@ppzCentos5 Multi_line_read_bin]# cat Multi_line_read.sh
#!/bin/bash
##如果没有参数直接退出
if [ ! -n "$1" -o ! -n "$2" ]
then
echo "USAGE:$0 filename num"
exit
fi
##获取文件行数
MultiLines=cat $1|wc -l
1>&2 >/dev/null
#如何文件总行数和每次处理行数相等
if [ "$MultiLines" -eq "$2" ]
then
line_start=1
line_end=${MultiLines}
#echo {line_start}"-"{line_end}
#处理数据
sed -n "{line_start},{line_end}p" $1>./split/date +%N
current_line.txt
exit
fi
##求文件行数和每次处理行数的余数
Remainder=(({MultiLines}%$2))
##文件行数减余数
reduce_Remainder=(({MultiLines}-${Remainder}))
#参数 2 减 1
mtl=$(($2-1))
[ "$mtl" -eq 0 ]&&{
mtl=1
}
#先处理总行数减余数后的部分
for((i=1;i<{reduce_Remainder};i+={mtl})){
if [ $i -gt 1 ]
then
((i++))
line_start=$i
line_end=(({i}+${mtl}))
else
line_start=$i
line_end=(({i}+${mtl}))
fi
#echo {line_start}"-"{line_end}
#处理数据
sed -n "{line_start},{line_end}p" $1>./split/date +%N
current_line.txt
}
#总行数和每次处理行数除不尽,则处理余数部分
if [ "MultiLines" -gt "reduce_Remainder" ]
then
line_start=(({reduce_Remainder}+1))
line_end=${MultiLines}
#echo {line_start}"-"{line_end}
#处理数据
sed -n "{line_start},{line_end}p" $1>./split/date +%N
current_line.txt
fi
处理 mongodb 数据的:把公共部分写成函数
[root@ppzCentos5 Multi_line_read_bin]# cat Multi_line_Contrast_id.sh
#!/bin/bash
##如果没有参数直接退出
if [ ! -n "$1" -o ! -n "$2" ]
then
echo "USAGE:$0 filename num"
exit
fi
#############设置数据库连接信息
cmd=/root/mongodb3/bin/mongo
ip=192.168.179.132
port=27011
dbname=image
collection=fs.files
#############定义目及相关文件
dir=pwd
content={dir}/{collection}_content.txt
success={dir}/{collection}_success.log
fail={dir}/{collection}_fail.log
runtime={dir}/{collection}_runtime.log
current_lines={dir}/{collection}_current_lines.txt
file_ObjectId_1=${dir}/file_ObjectId_1
file_ObjectId_2=${dir}/file_ObjectId_2
#把 id 列表转换成 ObjectId 类型
sed -n 's#^"#ObjectId("#gp' $1 1>&2 >${file_ObjectId_1}
sed -n 's#"#"),#gp' {file_ObjectId_1} 1>&2 >${file_ObjectId_2}
##获取文件行数
MultiLines=cat ${file_ObjectId_2}|wc -l
1>&2 >/dev/null
#############如果日志文件存在且不为空先清空
if [ -s success -o -s fail ]
then
echo>$success
echo>$fail
fi
##定义公用函数
qureyHandle(){
sed -n "{line_start},{line_end}p" $1 1>&2 >$current_lines
cmd ip:{port}/dbname --quiet --eval "db.{collection}.find({_id:{\$in:[`cat current_lines`]}},{_id:1,filename:1})" 1>&2 >$content
if [ ? -eq 0 -a -s content ]
then
echo "cat $content
">>$success
else
echo "cat $content
">>$fail
fi
}
echo "开始时间:"date +%F" "%T
>$runtime
#如何文件总行数和每次处理行数相等
if [ "$MultiLines" -eq "$2" ]
then
line_start=1
line_end=${MultiLines}
#echo {line_start}"-"{line_end}
#处理数据
qureyHandle ${file_ObjectId_2}
echo "结束时间:"date +%F" "%T
>>$runtime
#处理完退出
exit
fi
##求文件行数和每次处理行数的余数
Remainder=(({MultiLines}%$2))
##文件行数减余数
reduce_Remainder=(({MultiLines}-${Remainder}))
#参数 2 减 1
mtl=$(($2-1))
[ "$mtl" -eq 0 ]&&{
mtl=1
}
#先处理总行数减余数后的部分
for((i=1;i<{reduce_Remainder};i+={mtl})){
if [ $i -gt 1 ]
then
((i++))
line_start=$i
line_end=(({i}+${mtl}))
else
line_start=$i
line_end=(({i}+${mtl}))
fi
#echo {line_start}"-"{line_end}
#处理数据
qureyHandle ${file_ObjectId_2}
}
#总行数和每次处理行数除不尽,则处理余数部分
if [ "MultiLines" -gt "reduce_Remainder" ]
then
line_start=(({reduce_Remainder}+1))
line_end=${MultiLines}
#echo {line_start}"-"{line_end}
#处理数据
qureyHandle ${file_ObjectId_2}
fi
#处理查询到的结果
awk -F[()] '{print $2}' success>{success}_result
awk '{print $0}' $1 {success}_result|sort|uniq -u>{dir}/{1}_{success}_notexist
echo "结束时间:"date +%F" "%T
>>$runtime
[root@ppzCentos5 Multi_line_read_bin]
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于