2年前没用SHELL用C解决,目前AWK搞定,解决了个心病
#!/bin/sh
#!/bin/sh
#GB2312编码
#Author:xiamin
#20140320
#去除半个汉字
tmpLANG=$LANG
LANG=C
#cat a.txt
awk 'BEGIN{
while((getline str <"a.txt") >0 )
{
len=length(str);
#补上换行符
str=sprintf("%s%s",str,"\n");
len++;
#printf ("str[%s]",str);
for(i=0; i<len; i++)
{
line[i]=substr(str,i+1,1);
}
for(i=j=0; i<len; )
{
#printf("count[%d] in for\n",count++);
#DEC GB2312 if (ch1>=176 && ch1<=247 && ch2>=160 && ch2<=254)
#DEC GBK if (ch1>=129 && ch1<=254 && ch2>=64 && ch2<=254)
#DEC GB12 if (ch1>=129 && ch1<=254 && ch2>=64 && ch2<=254)
#最后一个字节无论高低字节区间都丢弃
if ((len >2) && (i == len - 1) && (line[i] >= "\100" && line[i] <= "\376"))
{
i++;
break;
}
else if (line[i] >= "\201" && line[i] <= "\376" && line[i+1] >= "\100" && line[i+1] <= "\376")
{
line2[j++]=line[i++];
line2[j++]=line[i++];
#print "CN2"
}
#低字节
else if ((line[i] >= "\201" && line[i] <= "\376") && (line[i+1] < "\100" || line[i+1] > "\376"))
i++;
#高字节直接丢弃
else if (line[i] >= "\100" && line[i] <= "\376")
i++;
else
line2[j++]=line[i++];
}
for(i=0; i<j; i++)
printf("%c",line2[i]);
#printf("\n");
}
}' > b.txt
LANG=$tmpLANG
exit