去除文件中的多余换行符

7 篇文章 0 订阅

去除文件中的多余换行符

###########################################################
#       Program: delimiter_deal.sh
###########################################################
#shell名
shName=`basename $0 .sh`
#log目录
log_dir=/home/mds/file/log/shelllog/delimiter_deal
#log文件
log_file=${log_dir}/${shName}_`date +%Y%m%d`.log

###日志函数
Log()
{
  createTime=`date  +"%Y-%m-%d %H:%M:%S"`
  echo "[${createTime}] $*" |tee -a ${log_file} 2>/dev/null 
}

### 
CheckDir()
{
  if [ ! -d $1 ]; then
    mkdir_log=` mkdir -p -m 775 $1 `
    if [ $? -ne 0 ]; then
      Log "[$1] create fail!"
      Log "[$1] does not exist!!please check..."
      exit 1
    fi    
  fi
}
CheckDir "$log_dir"

#从外部获取参数:处理文件(全路径),正确文件列数
deal_file=$1
col_num=$2
if [ $# -ne 2 ];then
    Log "Params input error, please check..."
    Log "Eg: sh dealfile_delimiter.sh abs_file_name col_num"
    exit 1
fi


#判断文件是否存在
if [ ! -f $deal_file ];then
    Log "[$deal_file] not exists ..."
    exit 1
fi

#获取文件路径
deal_path=`dirname $deal_file`
cd $deal_path
if [ $? -ne 0 ];then
    exit 1
fi
Log "切换路径成功,当前路径为: `pwd`"
Log "开始处理文件中的多余换行符: ${deal_file}"

#获取文件名
file_name=`basename $deal_file`

bak_file=${file_name}.bak`date +%m%d%H%M%S`
tmp_file=${file_name}.tmp`date +%m%d%H%M%S`
err_file=${file_name}.err`date +%m%d%H%M%S`
cp -f -p $deal_file ${bak_file} && chmod 775 ${bak_file}
if [ $? -eq 0 ]; then
    Log "备份原文件成功,备份文件为:${bak_file}"
    #备份成功后,清空原文件
    > ${file_name}
    if [ $? -ne 0 ]; then
        Log "清空原文件失败..."
        exit 1
    fi
    Log "清空原文件成功..."
else
    echo "备份文件失败"
    exit 1
fi

#少于指定列数且非空行的记录,分隔符为十六进制7F和十六进制5E作为一个分隔符
awk -F"[/\x7F][/\x5E]" '{if(NF < '$col_num' && NF >0 ) print $0}' <${bak_file} >${tmp_file}
if [ $? -ne 0 ]; then
    Log "读取文件中少于指定列数且非空行的记录失败..."
    exit 1
fi
Log "读取文件中少于指定列数且非空行的记录成功, 并记录到文件: ${tmp_file}"

Log "开始去除多余换行符,请等待..."
#处理换行
#拼接的新行; 上一条记录; 当前记录
new_line=""; old_line=""; cur_line=""
#当前行号; 拼接的总列数;  拼接的行数
rownum=0; total_colnum=0; deal_rows=0

for colnum in `awk -F"[/\x7F][/\x5E]" '{print NF}' <${tmp_file}`
do
    rownum=$((rownum+1))
    deal_rows=$((deal_rows+1))
    err_rows=$((err_rows+1))
    total_colnum=$((total_colnum+colnum))
    cur_line=`sed -n "$rownum"p <${tmp_file}`
    new_line="${old_line}${cur_line}"

    if [ $((total_colnum-deal_rows+1)) -eq $col_num ]; then
        #拼接成功后,将记录放到正常文件中
        echo "$new_line" >>$file_name
        new_line=""; total_colnum=0; deal_rows=0
    else
        echo "$new_line" >>${err_file}
    fi
    old_line=$new_line
    echo -n ". "
done
echo ""

Log "去除文件中的多余换行符完成..."

#生成正常列数的文件
awk -F"[/\x7F][/\x5E]" '{if(NF == '$col_num') print $0}' <${bak_file} >>${file_name}
Log "合并正常列数数据完成,处理后文件:${deal_file}"
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值