日期:2014-05-16  浏览次数:20635 次

如何在shell中按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 < $MY_FILE
fi


------解决方案--------------------
用awk行不?类似
log0=` echo $MY_LINE|awk '{print $1}' `
log1=` echo $MY_LINE|awk '{print $2}' `
这样,呵呵
------解决方案--------------------
JScript code
awk '{if($2 ~/^[^a-zA-Z0-9]/) print $2}' inputfile
#测试用例:
105454 查询账户 ************9424 63.80 008493 ******11 00:交易成功
105454 AABBCCDD ************9424 63.80 008493 ******11 00:交易成功

#测试结果:
查询账户