免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2207 | 回复: 8
打印 上一主题 下一主题

字符(中英文混合)截取问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-04-26 20:02 |只看该作者 |倒序浏览
有个文件如下:
560670|472|陈文|人民路飞鹤路安置房C幢4单元(交通局北面)|0|0|0|0|0.00|1.00|
560563|1494|陈一益|二里许经济房21幢1单元(变电所边)|0|0|0|0|0.00|1.00|
569705|12849|尉浩|赤城路人民西路交叉口东16、17、20、21|237|281|0|44|82.72|1.88|3899111
578631|13165|周利|人民东路紫金路临街(圣昌药业边)|236|264|0|28|28.00|1.00|
571024|13348|曹伟|二里许后门新村|130|151|0|21|21.00|1.00|6888211
571578|13599|义舟|工人西路皇家公寓临街(东10-12)|259|1071|0|812|1526.56|1.88|6666666

如果第四个字段的长度超过30个字符,就截取该字段前面的30个字符。

想要得到的结果:

560670|472|陈文|人民路飞鹤路安置房C幢4单元(交|0|0|0|0|0.00|1.00|
560563|1494|陈一益|二里许经济房21幢1单元(变电所|0|0|0|0|0.00|1.00|
569705|12849|尉浩|赤城路人民西路交叉口东16、17、|237|281|0|44|82.72|1.88|3899111
578631|13165|周利|人民东路紫金路临街(圣昌药业边|236|264|0|28|28.00|1.00|
571024|13348|曹伟|二里许后门新村|130|151|0|21|21.00|1.00|6888211
571578|13599|义舟|工人西路皇家公寓临街(东10-12|259|1071|0|812|1526.56|1.88|6666666

我的awk如下:

  1. #如果第四个字段的长度超过30个字符,截取前面的30个字符。
  2. BEGIN {FS="|"}
  3.   { if (length($4)<=30) {print $0}
  4.          else    {
  5.                      for (i=1;i<=NF;i++)
  6.                         {  if (i !=4) printf $i
  7.                                else  printf  substr_cut($i,30)
  8.                            if (i != NF) printf "|"
  9.                          }
  10.                       printf "\n"
  11.                    }
  12.   }
  13. function substr_cut(str_cut,strlength )
  14. {
  15.    count=0
  16.    for (i=1;i<strlength;i++)
  17.      {
  18.          tmpstr=substr(str_cut,i,1)
  19.          if (  tmpstr ~  "[a-zA-Z0-9 ()]"  || tmpstr ~ "-" ) count++
  20.                                                       else   i++
  21.      }
  22.   if (count % 2==0) return substr(str_cut,1,strlength)
  23.                else return substr(str_cut,1,strlength-1)
  24. }
复制代码


运行结果却是:
560670|472|陈文|人民路飞鹤路安置房C幢4单元(交|
560563|1494|陈一益|二里许经济房21幢1单元(变电所|
569705|12849|尉浩|赤城路人民西路交叉口东16、17、|
578631|13165|周利|人民东路紫金路临街(圣昌药业边|
571024|13348|曹伟|二里许后门新村|130|151|0|21|21.00|1.00|6888211
571578|13599|义舟|工人西路皇家公寓临街(东10-12|

后来将for循环分两部分,是得到了预期的结果。

   for (i=1;i<=3;i++)
       printf ("%s|",$i)
   printf ("%s|", substr_cut($i,30))
   for (i=5;i<=NF;i++)
      if (i != NF) printf ("%s|",$i)
              else printf ("%s\n",$i)

  有几个问题请各位帮忙看看,谢谢!

   1. 为什么调用substr_cut函数会中断for循环?
   2. awk中有没有类似ord 的函数?
   3. 如何在开始的时候将要判断的字母、数字、空格等字符放在数组中,在substr_cut中调用?

论坛徽章:
0
2 [报告]
发表于 2004-04-27 13:33 |只看该作者

字符(中英文混合)截取问题

你用printf函数,指定输出域的宽度

论坛徽章:
0
3 [报告]
发表于 2004-04-27 15:38 |只看该作者

字符(中英文混合)截取问题


  1. awk -F"|" '{printf("%s|%s|%s|%-30.30s|%s|%s|%s|%s|%s|%s|\n",$1,$2,$3,$4,$5,$6,$7,$8,$9,$10)}' file
复制代码

论坛徽章:
0
4 [报告]
发表于 2004-04-27 15:47 |只看该作者

字符(中英文混合)截取问题

  1. awk -F\| '{OFS="|"}$4=substr($4,1,30){print}' file
复制代码

论坛徽章:
0
5 [报告]
发表于 2004-04-27 16:16 |只看该作者

字符(中英文混合)截取问题

高,我怎么没想到?郁闷……

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
6 [报告]
发表于 2004-04-27 16:38 |只看该作者

字符(中英文混合)截取问题

原帖由 "c1l2d3"][/quote 发表:

跟我不谋而合,但有一个问题----半个汉字!所以我没有敢贴出来,昨天晚上捉摸了好久,没有答案......苦啊!
[quote]
560670|472|陈文|人民路飞鹤路安置房C幢4单元(交|0|0|0|0|0.00|1.00|
560563|1494|陈一益|二里许经济房21幢1单元(变电所眧|0|0|0|0.00|1.00|
569705|12849|尉浩|赤城路人民西路交叉口东16、17、|237|281|0|44|82.72|1.88|3899111

578631|13165|周利|人民东路紫金路临街(圣昌药业边|236|264|0|28|28.00|1.00|
571024|13348|曹伟|二里许后门新村|130|151|0|21|21.00|1.00|6888211
571578|13599|义舟|工人西路皇家公寓临街(东10-12?259|1071|0|812|1526.56|1.88|6666666

论坛徽章:
0
7 [报告]
发表于 2004-04-27 16:54 |只看该作者

字符(中英文混合)截取问题

[quote]原帖由 "c1l2d3"][/quote 发表:

我也这样的用的,但是出来半个汉字!

论坛徽章:
0
8 [报告]
发表于 2004-04-27 17:01 |只看该作者

字符(中英文混合)截取问题

$4=substr($4,0,30)

论坛徽章:
0
9 [报告]
发表于 2004-04-28 11:12 |只看该作者

字符(中英文混合)截取问题

[quote]原帖由 "admirer"][/quote 发表:


的确如此,呵呵~出了个半成品=废品. 在想想
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP