免费注册 查看新帖 |

Chinaunix

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

[文本处理] 多行截取指定位置字符串?? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-08-20 14:04 |只看该作者 |倒序浏览
有一个多行文本,每行80个字符。

怎样跨行截取指定位置的字符串?比如第522个-第988个之间的字符串。含第522和第988位置的字符。

论坛徽章:
10
天蝎座
日期:2013-09-22 22:32:23程序设计版块每日发帖之星
日期:2016-08-07 06:20:00lufei
日期:2016-06-17 17:38:40程序设计版块每日发帖之星
日期:2016-06-12 06:20:002016科比退役纪念章
日期:2016-05-31 15:47:20CU十四周年纪念徽章
日期:2016-05-27 12:24:562015年亚洲杯之阿曼
日期:2015-05-03 21:01:352015年辞旧岁徽章
日期:2015-03-03 16:54:15天蝎座
日期:2013-10-20 21:05:24程序设计版块每日发帖之星
日期:2016-08-11 06:20:00
2 [报告]
发表于 2012-08-20 14:37 |只看该作者
本帖最后由 liion631818 于 2012-08-20 14:42 编辑

  1. all=
  2. while read line; do all=$all$line; if [[ ${#all} > 988 ]]; then echo ${all:522:((988 - 522))}; break; fi; done<ufile
复制代码

论坛徽章:
15
2015年辞旧岁徽章
日期:2015-03-03 16:54:15双鱼座
日期:2015-01-15 17:29:44午马
日期:2015-01-06 17:06:51子鼠
日期:2014-11-24 10:11:13寅虎
日期:2014-08-18 07:10:55酉鸡
日期:2014-04-02 12:24:51双子座
日期:2014-04-02 12:19:44天秤座
日期:2014-03-17 11:43:36亥猪
日期:2014-03-13 08:13:51未羊
日期:2014-03-11 12:42:03白羊座
日期:2013-11-20 10:15:18CU大牛徽章
日期:2013-04-17 11:48:45
3 [报告]
发表于 2012-08-20 14:49 |只看该作者
本帖最后由 rdcwayx 于 2012-08-20 17:01 编辑

不清楚楼主是否还要保留原来的格式(80个字符为一行)?如果截取的字符在一行的中间,如何显示?

所以这个最好先给个例子,比如下面的例子,如果要截取 522 到988个字符,需要什么样的输出。

  1. 1*2*3*4*5*6*7*8*9*10*11*12*13*14*15*16*17*18*19*20*21*22*23*24*25*26*27*28*29*30
  2. *31*32*33*34*35*36*37*38*39*40*41*42*43*44*45*46*47*48*49*50*51*52*53*54*55*56*5
  3. 7*58*59*60*61*62*63*64*65*66*67*68*69*70*71*72*73*74*75*76*77*78*79*80*81*82*83*
  4. 84*85*86*87*88*89*90*91*92*93*94*95*96*97*98*99*100*101*102*103*104*105*106*107*
  5. 108*109*110*111*112*113*114*115*116*117*118*119*120*121*122*123*124*125*126*127*
  6. 128*129*130*131*132*133*134*135*136*137*138*139*140*141*142*143*144*145*146*147*
  7. 148*149*150*151*152*153*154*155*156*157*158*159*160*161*162*163*164*165*166*167*
  8. 168*169*170*171*172*173*174*175*176*177*178*179*180*181*182*183*184*185*186*187*
  9. 188*189*190*191*192*193*194*195*196*197*198*199*200*201*202*203*204*205*206*207*
  10. 208*209*210*211*212*213*214*215*216*217*218*219*220*221*222*223*224*225*226*227*
  11. 228*229*230*231*232*233*234*235*236*237*238*239*240*241*242*243*244*245*246*247*
  12. 248*249*250*251*252*253*254*255*256*257*258*259*260*261*262*263*264*265*266*267*
  13. 268*269*270*271*272*273*274*275*276*277*278*279*280*281*282*283*284*285*286*287*
  14. 288*289*290*291*292*293*294*295*296*297*298*299*300*301*302*303*304*305*306*307*
复制代码

论坛徽章:
0
4 [报告]
发表于 2012-08-20 14:49 |只看该作者
回复 1# nb509
  1. awk '{T=T RS$0}END{print substr(T,523,466)}' file
复制代码
包括换行符

论坛徽章:
0
5 [报告]
发表于 2012-08-20 14:56 |只看该作者
cat file.txt | cut -b 522-988

论坛徽章:
0
6 [报告]
发表于 2012-08-20 15:05 |只看该作者
回复 2# liion631818


多谢回复,您的方法字符小于1000可以,大于1000就不行了。

   

论坛徽章:
0
7 [报告]
发表于 2012-08-20 15:12 |只看该作者
回复 3# rdcwayx

多谢回复。最好能够按每行80字符显示,如果截取的位置在中间,输出时前面不要有空格。

另外,文件比较大,直接cat是不行的。
  1. 21*22*23*24*25*26*27*28*29*30*31*32*33*34*35*36*37*38*39*40*41*42*43*44*45*46*47*
  2. 48*49*50*51*52*53*54*55*56*57*58*59*60*61*62*63*64*65*66*67*68*69*70*71*72*73*74*
  3. 75*76*77*78*79*80*81*82*83*
复制代码

论坛徽章:
15
2015年辞旧岁徽章
日期:2015-03-03 16:54:15双鱼座
日期:2015-01-15 17:29:44午马
日期:2015-01-06 17:06:51子鼠
日期:2014-11-24 10:11:13寅虎
日期:2014-08-18 07:10:55酉鸡
日期:2014-04-02 12:24:51双子座
日期:2014-04-02 12:19:44天秤座
日期:2014-03-17 11:43:36亥猪
日期:2014-03-13 08:13:51未羊
日期:2014-03-11 12:42:03白羊座
日期:2013-11-20 10:15:18CU大牛徽章
日期:2013-04-17 11:48:45
8 [报告]
发表于 2012-08-20 15:13 |只看该作者
回复 2# liion631818

    all=
    while read line; do all=$all$line; if [[ ${#all} > 988 ]]; then echo ${all:522988 - 522))}; break; fi; done<ufile


奇怪,你的脚本在我的bash里没有结果输出。按照你的思路,稍微改了一下。
  1. min=522
  2. max=988
  3. all=""

  4. while read line
  5. do
  6.    all=$all$line
  7.    if [[ "${#all}" -gt "$max" ]]; then
  8.           echo ${all:522:(($max - $min + 1))}
  9.           exit
  10.    fi
  11. done<ufile
复制代码

论坛徽章:
10
天蝎座
日期:2013-09-22 22:32:23程序设计版块每日发帖之星
日期:2016-08-07 06:20:00lufei
日期:2016-06-17 17:38:40程序设计版块每日发帖之星
日期:2016-06-12 06:20:002016科比退役纪念章
日期:2016-05-31 15:47:20CU十四周年纪念徽章
日期:2016-05-27 12:24:562015年亚洲杯之阿曼
日期:2015-05-03 21:01:352015年辞旧岁徽章
日期:2015-03-03 16:54:15天蝎座
日期:2013-10-20 21:05:24程序设计版块每日发帖之星
日期:2016-08-11 06:20:00
9 [报告]
发表于 2012-08-20 15:14 |只看该作者
如果真的是文件太大导致这些问题,可以先用split先把文件拆分了

论坛徽章:
0
10 [报告]
发表于 2012-08-20 15:20 |只看该作者
回复 8# rdcwayx


   多谢各位,这个改了以后,可以输出了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP