当前位置: 技术问答>linux和unix
如何在shell中按2个字符来截取文本文件中的中文字符
来源: 互联网 发布时间:2016-12-13
本文导语: 先说下业务需求吧: 有一个日志文件,相当于是记事本格式的,每行是一条记录。 每行记录的长度是固定长度的,其中汉字是占位2个字符的,每行记录固定第几位到第几位是某种意义的。 现在的需求是将每行的记...
先说下业务需求吧:
有一个日志文件,相当于是记事本格式的,每行是一条记录。
每行记录的长度是固定长度的,其中汉字是占位2个字符的,每行记录固定第几位到第几位是某种意义的。
现在的需求是将每行的记录截取出来,并导入数据库中。
服务器环境是linux,数据库是oracle,我准备用按行读文件的方式,将每行的字符串读取出来,然后分解字符串,然后组合成sql语句,并输出生一个sql脚本。
然后调用oracle的sqlplus,运行sql脚本,并提交数据。
日志中的一行数据如下:
105454 查询账户 ************9424 63.80 008493 ******11 00:交易成功
其中“105454”是一个字段,“查询账户”是一个字段。
“105454”是从第0位到第5位,共6个字符,“查询账户”是从第7位到第14位,共8个字符,或4个汉字。
请问如何截取?
另:有可能有的行数据,第二个字段不是汉字,是字母的,但是同样最多占位8个字符。
我目前使用的截取字符串的方式中,汉字被当成一个字符处理,所以无法使用。
我目前使用的脚本如下:
#!/bin/bash
#引入环境变量
. $HOME/.bash_profile
#设定sql脚本文件路径及文件名
SQLSCRIPT="$HOME/sqlfile.sql"
#删除同名文件
rm -rf $SQLSCRIPT
#读取日志文件
MY_FILE="/home/log/20110710log"
#判断文件是否存在
if [ -e $MY_FILE ]
then
MY_LINE_NO=1
while read MY_LINE
do
log[0]=${MY_LINE:0:6}
log[1]=${MY_LINE:7:8}
log[2]=${MY_LINE:18:18}
log[3]=${MY_LINE:34:11}
log[4]=${MY_LINE:46:6}
log[5]=${MY_LINE:53:8}
log[6]=${MY_LINE:62}
echo "insert into loguser.monlog0(logdate,logtime,txnname,txnpan,txnamt,txnnum,txntel,txnres) values('$LD','${log[0]}','${log[1]}','${log[2]}',${log[3]},'${log[4]}','${log[5]}','${log[6]}');">>$SQLSCRIPT
MY_LINE_NO=$((MY_LINE_NO+1))
done
有一个日志文件,相当于是记事本格式的,每行是一条记录。
每行记录的长度是固定长度的,其中汉字是占位2个字符的,每行记录固定第几位到第几位是某种意义的。
现在的需求是将每行的记录截取出来,并导入数据库中。
服务器环境是linux,数据库是oracle,我准备用按行读文件的方式,将每行的字符串读取出来,然后分解字符串,然后组合成sql语句,并输出生一个sql脚本。
然后调用oracle的sqlplus,运行sql脚本,并提交数据。
日志中的一行数据如下:
105454 查询账户 ************9424 63.80 008493 ******11 00:交易成功
其中“105454”是一个字段,“查询账户”是一个字段。
“105454”是从第0位到第5位,共6个字符,“查询账户”是从第7位到第14位,共8个字符,或4个汉字。
请问如何截取?
另:有可能有的行数据,第二个字段不是汉字,是字母的,但是同样最多占位8个字符。
我目前使用的截取字符串的方式中,汉字被当成一个字符处理,所以无法使用。
我目前使用的脚本如下:
#!/bin/bash
#引入环境变量
. $HOME/.bash_profile
#设定sql脚本文件路径及文件名
SQLSCRIPT="$HOME/sqlfile.sql"
#删除同名文件
rm -rf $SQLSCRIPT
#读取日志文件
MY_FILE="/home/log/20110710log"
#判断文件是否存在
if [ -e $MY_FILE ]
then
MY_LINE_NO=1
while read MY_LINE
do
log[0]=${MY_LINE:0:6}
log[1]=${MY_LINE:7:8}
log[2]=${MY_LINE:18:18}
log[3]=${MY_LINE:34:11}
log[4]=${MY_LINE:46:6}
log[5]=${MY_LINE:53:8}
log[6]=${MY_LINE:62}
echo "insert into loguser.monlog0(logdate,logtime,txnname,txnpan,txnamt,txnnum,txntel,txnres) values('$LD','${log[0]}','${log[1]}','${log[2]}',${log[3]},'${log[4]}','${log[5]}','${log[6]}');">>$SQLSCRIPT
MY_LINE_NO=$((MY_LINE_NO+1))
done