shell脚本(一)

前言

用了也有半年的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 脚本代码每天处理了这么多数据,那几天可是通宵搞优化了好几次才解决问题,得炫耀一下哈哈

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值