- 论坛徽章:
- 0
|
本帖最后由 吾非真好汉 于 2013-06-26 16:10 编辑
问题现状:
sqldr导入数据后有个bad文件,sqlldr失败生成bad文件的原因是数据库里原始数据某个字段最后一位存在半个汉字的乱码,因此打算通过awk来查找并替换掉乱码,
尝试awk命令如下:
awk -F "分隔符" 'BEGIN {
for (i=0;i<255;i++)
a[sprintf("%c",i)]=i;
} //生成0-255的asc码映射
{
for(i=1;i<=NF;i++) //按分隔符遍历字段
{
ch=0;
for(s=1;s<=length($i);s++) //遍历字段内字符
{
if(a[substr($i,s,1)]>128 //累计asc码大于128的字符数
{
ch++;
}
}
if(ch%2==1) //为奇数,认为此列最后一位为半个汉字的乱码(汉字有两个字符,asc码都大于128)
{
gsub(/substr($i,s,1)/,"",$i); //替换
}
}
print $0 >>"n00_crm_id_cust_20130606.dat"
}' n00_crm_id_cust_20130606.bad
遭遇问题:
gsub(/substr($i,s,1)/,"",$i); //替换
此代码不能如愿替换,因为正则模式里使用了函数、变量,替换时,会拿"substr($i,s,1)"去匹配,而不是函数表达式的值,
请教各们,gsub的正则模式能否使用函数、变量? 如何可能,需要采用什么样的书写格式 ?
如果正则模式不能带变量,那么此功能需求如何实现?
能否在awk命令里使用sed来做替换 ?
|
|