脚本处理大数据文件
程序员文章站
2022-06-03 17:57:46
...
在处理XX行的生产问题时,碰到过一次一个几十个G的文件,其中有几万条数据有一些问题,应急版本又来不及下发。最后采用了脚本处理的方法。用时大概几分钟吧。
下面详细介绍脚本的处理过程。
处理的核心是利用sed将问题文件中的错误数据替换为正确的数据
1.由于文件中内容过多,为了防止误操作,首先将文件按列切分为多个文件(问题文件内容每行定长)。
cutfile.sh
#! /bin/ksh
if [ $# != 1 ]
then
echo "FORMAT: cutfile.sh inputfile !"
exit 1;
fi
filename=$1
head -n 1 $filename > .filehead.txt
tail -n +2 $filename > .filebody.txt
cut -c1-44 .filebody.txt > .fileblock_1
cut -c45-52 .filebody.txt > fileblock_2_gmt_date.txt # gmt_date
cut -c53-68 .filebody.txt > .fileblock_3
cut -c69-76 .filebody.txt > fileblock_4_local_date.txt # local_date
cut -c77-82 .filebody.txt > .fileblock_5
cut -c83-90 .filebody.txt > fileblock_6_settlement_date.txt # settlement_date
cut -c91-98 .filebody.txt > fileblock_7_capture_date.txt # capture_date
cut -c99-294 .filebody.txt > .fileblock_8
cut -c295-302 .filebody.txt > fileblock_9_orig_date.txt # orig_date
cut -c303- .filebody.txt > .fileblock_10
touch .CUT.OK
2.对切分开的错误文件做统计,查找出错次数
uniqfile.sh
#! /bin/ksh
if [ $# != 1 ]
then
echo "FORMAT: nuiqfile.sh inputfile !"
exit 1;
fi
filename=$1
cat $filename | sort | uniq -c
3.对出错切分文件进行替换操作
#! /bin/ksh
if [ $# != 3 ]
then
echo "FORMAT: sedfile.sh filename replacebefore replaceafter!"
exit 1;
fi
if [ ! -f .CUT.OK ];then
echo "please cut file,first!"
exit 0
fi
filename=$1
repstr1=$2
repstr2=$3
sed "s/${repstr1}/${repstr2}/" $filename > .sedtmpfile
rm -f $filename
mv .sedtmpfile $filename
4.对处理过的文件进行合并,最后生成正确的文件
#! /bin/ksh
if [ $# != 1 ]
then
echo "FORMAT: pastefile.sh inputfile !"
exit 1;
fi
if [ ! -f .CUT.OK ];then
echo "please cut file,first!"
exit 0
fi
filename=$1
# 如果文件中有\t,那么指定paste时的间隔符比如@,所以操作之前要用grep " " filename | wc -l验证
#paste -d @ .fileblock_1 \
paste .fileblock_1 \
fileblock_2_gmt_date.txt \
.fileblock_3 \
fileblock_4_local_date.txt \
.fileblock_5 \
fileblock_6_settlement_date.txt \
fileblock_7_capture_date.txt \
.fileblock_8 \
fileblock_9_orig_date.txt \
.fileblock_10 > .filebodytmp.txt
#sed -e 's/@//g' .filebodytmp.txt > .filenewbody.txt
sed -e 's/ //g' .filebodytmp.txt > .filenewbody.txt
cat .filehead.txt .filenewbody.txt > ${filename}.new
rm -f .fileblock_1 \
fileblock_2_gmt_date.txt \
.fileblock_3 \
fileblock_4_local_date.txt \
.fileblock_5 \
fileblock_6_settlement_date.txt \
fileblock_7_capture_date.txt \
.fileblock_8 \
fileblock_9_orig_date.txt \
.fileblock_10
rm -f .filehead.txt .filebody.txt .filenewbody.txt .filebodytmp.txt .CUT.OK
上一篇: 嗯,应该没有比这个更刺激的了