前言
用了也有半年的shell脚本,这里来记录一下一些之前通过shell 对数据做清洗的一些有意思的知识,万一以后用到可以翻出来抄一抄。
一、删掉最后一个 / 及其左边的字符串
gzname=${filepathandname##*/}
二、删掉最后一个 .及其右边的字符串
filename=${gzname%.*}
三、通过cut截取字符串
filetime=$(echo "$filename"|cut -d "_" -f 4)
四、对日期进行格式转换
p_date=$(date -d @${time} +"%Y-%m-%d")
五、声明一个map集合
declare -A map=(
["A"]=65 ["B"]=66 ["C"]=67 ["D"]=68 ["E"]=69
)
六、创建文件夹,移动文件,并解压
moveGziptoTemp(){
if [[ ! -d $2 ]]
then
mkdir -p $2
fi
mv -f $1 $2
gunzip $2/$gzname
}
七、对某个文件按指定字段切割,再合并到新文件内
mergeFiles(){
for key in ${!map[*]}
do
{
local pcode=${map[${key}]:0:2}
awk -F"|" '$2=="'${key}'" && $16>="'${time}'" && $16<"'${times}'" {print $0}' ${tempdir}/$filename >> ${generated_path}/${tablename}_${map[${key}]}_${dayid}_${p_hour}_${p_hour}_${filename}
flock -x $generated_lockPath/${pcode}_filelocked_0 -c "cat ${generated_path}/${tablename}_${map[${key}]}_${dayid}_${p_hour}_${p_hour}_${filename} >> ${generated_path}/${tablename}_${map[${key}]}_${dayid}_${p_hour}_${p_hour}_0"
rm -rf ${generated_path}/${tablename}_${map[${key}]}_${dayid}_${p_hour}_${p_hour}_${filename}
awk -F"|" '$2=="'${key}'" && $16>="'${timeone}'" && $16<"'${time}'" {print $0}' ${tempdir}/$filename >> ${generated_path1}/${tablename}_${map[${key}]}_${dayid1}_${p_hour}_${p_hour1}_${filename}
flock -x $generated_lockPath/${pcode}_filelocked_1 -c "cat ${generated_path1}/${tablename}_${map[${key}]}_${dayid1}_${p_hour}_${p_hour1}_${filename} >> ${generated_path1}/${tablename}_${map[${key}]}_${dayid1}_${p_hour}_${p_hour1}_1"
rm -f ${generated_path1}/${tablename}_${map[${key}]}_${dayid1}_${p_hour}_${p_hour1}_${filename}
} &
done
wait
}
八、对文件合并
mvFilesToPostDir(){
local ftime=`date +%s`
local newfilesize=114217728
local generatedPath=$1
local tName=$2
local provinceCode=$3
local dayId=$4
local hourStart=$5
local hourEnd=$6
local filename=$7
local postPath=$8
filesize=`ls -l ${generatedPath}/${tName}_${provinceCode}_${dayId}_${hourStart}_${hourEnd}_$filename | awk '{ print $5 }'`
if [[ $filesize -gt $newfilesize ]];then
local filemerged=${generatedPath}/${tName}_${provinceCode}_${dayId}_${hourStart}_${hourEnd}_$filename
##锁住移动目标文件,不许其他线程继续写入操作
local pcode=${provinceCode:0:2}
eval " exec ${pcode}>$generated_lockPath/${pcode}_filelocked_${filename} "
(
flock -x ${pcode}
echo 进程号:$$ ,已获取写锁将对文件 $filemerged 移动操作 >&${pcode}
if [[ $filesize -gt $newfilesize ]];then
mv -f $filemerged ${postPath}/${tName}_${provinceCode}_${dayId}_${hourStart}_${hourEnd}_${ftime}.csv
echo "${tName}_${provinceCode}_${dayId}_${hourStart}_${hourEnd}_${ftime}.csv $filesize" >> $generated_filesfinished/csv_${p_date}.log
fi
echo 进程号:$$ ,将释放写锁对文件 $filemerged 结束操作 >&${pcode}
flock -u ${pcode}
)
fi
}
九、if条件匹配字符串内是否包含某个字段。
if [[ $filepathandname =~ "match_string" ]];then
tablename="ods_table_name"
else
rm -f $filepathandname
exit 0
fi
———
靠着这几行shell 脚本代码每天处理了这么多数据,那几天可是通宵搞优化了好几次才解决问题,得炫耀一下哈哈