- 论坛徽章:
- 0
|
有个文件如下:
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如下:
- #如果第四个字段的长度超过30个字符,截取前面的30个字符。
- BEGIN {FS="|"}
- { if (length($4)<=30) {print $0}
- else {
- for (i=1;i<=NF;i++)
- { if (i !=4) printf $i
- else printf substr_cut($i,30)
- if (i != NF) printf "|"
- }
- printf "\n"
- }
- }
- function substr_cut(str_cut,strlength )
- {
- count=0
- for (i=1;i<strlength;i++)
- {
- tmpstr=substr(str_cut,i,1)
- if ( tmpstr ~ "[a-zA-Z0-9 ()]" || tmpstr ~ "-" ) count++
- else i++
- }
- if (count % 2==0) return substr(str_cut,1,strlength)
- else return substr(str_cut,1,strlength-1)
- }
复制代码
运行结果却是:
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中调用? |
|