免费注册 查看新帖 |

Chinaunix

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

用perl命令行提取指定行到指定位置,其他默认输出 [复制链接]

论坛徽章:
8
双子座
日期:2013-08-31 07:37:12金牛座
日期:2013-09-09 18:49:12处女座
日期:2013-09-23 11:43:14处女座
日期:2013-10-09 19:48:21狮子座
日期:2014-03-24 18:22:12丑牛
日期:2014-04-22 22:07:51申猴
日期:2014-06-12 21:54:13双鱼座
日期:2014-06-13 21:52:31
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-12-03 20:37 |只看该作者 |倒序浏览
本帖最后由 kernel69 于 2012-12-03 22:56 编辑

在shell版看到一帖,想用perl命令行来实现,请大牛们帮忙,
文本如下:
LTO-112                                 
   1.00000000000000     
     7.7228425617038052   -1.1728241973308142    0.0000783765917769
     0.0154894469072108   13.1856961357670865    0.0030255004255562
     0.0005099584114049    0.0025575613443815   11.1620206915956075
   N    O    Ti   La
     2    54    16    16
Direct
  0.7774215004064313  0.1115183520588823  0.3975691032523719  !   O 1
  0.7771581464215501  0.1089297591197067  0.9024626546976567  !   O 2  
  0.2724167356846352  0.0892053653452632  0.3395504485160841  !   O 3  
  0.2730739211704762  0.0920101685285890  0.8424744814611309  !   O 4  
  0.0375063320525867  0.0189181619988713  0.0113650832426271  !   O 5  
  0.0365639745275992  0.0190801381676232  0.5117751570324968  !   O 6  
  0.4726361611294826  0.0208567905544868  0.0114666074551770  !   O 7  
  0.4740039724211500  0.0212090000784555  0.5117259506938966  !   O 8  
  0.1102180912358619  0.2287966682670296  0.4808739940375588  !   O 9  
  0.1082787292444457  0.2277465339852076  0.9808863659422654  !   O 10
  0.5047713377152230  0.2322004469818953  0.4780386588074450  !   O 11
  0.5059567860449274  0.2308850118864839  0.9778788455825969  !   O 12
  0.0306657407452050  0.1855576162473936  0.2249739665642037  !   O 13
  0.0286688753220992  0.1850095370859427  0.7261973101857051  !   O 14
  0.5607981933228251  0.1842478667545847  0.2227362284969601  !   O 15
  0.5628436290100254  0.1835949663173362  0.7241398630945840  !   O 16
  0.0844940391742547  0.4075450250314948  0.2786555919397753  !   O 17
  0.0847144095905826  0.4075106445105974  0.7788453294753575  !   O 18
  0.6183352817388390  0.3960686664334347  0.2872963146044206  !   O 19
  0.6182086687431423  0.3958656917719918  0.7875423740163315  !   O 20
  0.1233091378066253  0.4304550605450148  0.0371544327048564  !   O 21
  0.1231592688039196  0.4307100191731379  0.5376665959498181  !   O 22
  0.5958927121806848  0.4398154592128560  0.0427595519777654  !   O 23
  0.5961285549301263  0.4400608080615391  0.5433837235740554  !   O 24
  0.3278880279280379  0.3088022264155676  0.1671011844098544  !   O 25
  0.3279347411765126  0.3086165081646174  0.6678438914641215  !   O 26
  0.8262572705420765  0.3052066878686089  0.1064335068510608  !   O 27
  0.8263419867565519  0.3053722289679932  0.6070010296661088  !   O 28
  0.2227088528521967  0.8903249303209398  0.1519725028946477  !   O 29
  0.2228805336352401  0.8910382005582520  0.6525961852954097  !   O 30
  0.7270069998272813  0.9081857062726386  0.0917546085589852  !   O 31
  0.7268034839149164  0.9074318918717618  0.5919982177966845  !   O 32
  0.9630604679600919  0.9795980675156690  0.2612526320192473  !   O 33
  0.9630912707186527  0.9804995968322487  0.7614574501246922  !   O 34
  0.5261765035865646  0.9777158543488299  0.2613113026519991  !   O 35
  0.5264236150187530  0.9785116440802124  0.7615566146330760  !   O 36
  0.8913617615404948  0.7721820384388214  0.2308060240528116  !   O 37
  0.8917143507518773  0.7722919070249790  0.7309905232859238  !   O 38
  0.4944035362630213  0.7692207011350506  0.2279691408755182  !   O 39
  0.4939941797077887  0.7691937702572762  0.7280706376784744  !   O 40
  0.9720727911364467  0.8147475329909236  0.4759195937277313  !   O 41
  0.9721156212703318  0.8150197319692353  0.9756499236771080  !   O 42
  0.4364168709255045  0.8161601108620860  0.4738892374363887  !   O 43
  0.4364562481569679  0.8164184671426239  0.9735825791979374  !   O 44
  0.9155102422319800  0.5926856736553917  0.0288332502914128  !   O 45
  0.9154979783730705  0.5926300829865471  0.5289578428877402  !   O 46
  0.3817522880864018  0.6043857651787646  0.0376318901566861  !   O 47
  0.3817160543137474  0.6042374780435397  0.5376893080969934  !   O 48
  0.8769420718502774  0.5697560417825575  0.2875855124316236  !   O 49
  0.8768979398345339  0.5697431069870185  0.7874643113843084  !   O 50

现在给定任意两个小于50的数字,例如3,5,如何把包含O3和O5的两行移到Direct下面?

替换后成为如下形式:
LTO-112                                 
   1.00000000000000     
     7.7228425617038052   -1.1728241973308142    0.0000783765917769
     0.0154894469072108   13.1856961357670865    0.0030255004255562
     0.0005099584114049    0.0025575613443815   11.1620206915956075
   N    O    Ti   La
     2    54    16    16
Direct
  0.2724167356846352  0.0892053653452632  0.3395504485160841  !   O 3
  0.0375063320525867  0.0189181619988713  0.0113650832426271  !   O 5

  0.7774215004064313  0.1115183520588823  0.3975691032523719  !   O 1
  0.7771581464215501  0.1089297591197067  0.9024626546976567  !   O 2  
  0.2730739211704762  0.0920101685285890  0.8424744814611309  !   O 4  
  0.0365639745275992  0.0190801381676232  0.5117751570324968  !   O 6  
  0.4726361611294826  0.0208567905544868  0.0114666074551770  !   O 7  
  0.4740039724211500  0.0212090000784555  0.5117259506938966  !   O 8  
  0.1102180912358619  0.2287966682670296  0.4808739940375588  !   O 9  
  0.1082787292444457  0.2277465339852076  0.9808863659422654  !   O 10
  0.5047713377152230  0.2322004469818953  0.4780386588074450  !   O 11
  0.5059567860449274  0.2308850118864839  0.9778788455825969  !   O 12
  0.0306657407452050  0.1855576162473936  0.2249739665642037  !   O 13
  0.0286688753220992  0.1850095370859427  0.7261973101857051  !   O 14
  0.5607981933228251  0.1842478667545847  0.2227362284969601  !   O 15
  0.5628436290100254  0.1835949663173362  0.7241398630945840  !   O 16
  0.0844940391742547  0.4075450250314948  0.2786555919397753  !   O 17
  0.0847144095905826  0.4075106445105974  0.7788453294753575  !   O 18
  0.6183352817388390  0.3960686664334347  0.2872963146044206  !   O 19
  0.6182086687431423  0.3958656917719918  0.7875423740163315  !   O 20
  0.1233091378066253  0.4304550605450148  0.0371544327048564  !   O 21
  0.1231592688039196  0.4307100191731379  0.5376665959498181  !   O 22
  0.5958927121806848  0.4398154592128560  0.0427595519777654  !   O 23
  0.5961285549301263  0.4400608080615391  0.5433837235740554  !   O 24
  0.3278880279280379  0.3088022264155676  0.1671011844098544  !   O 25
  0.3279347411765126  0.3086165081646174  0.6678438914641215  !   O 26
  0.8262572705420765  0.3052066878686089  0.1064335068510608  !   O 27
  0.8263419867565519  0.3053722289679932  0.6070010296661088  !   O 28
  0.2227088528521967  0.8903249303209398  0.1519725028946477  !   O 29
  0.2228805336352401  0.8910382005582520  0.6525961852954097  !   O 30
  0.7270069998272813  0.9081857062726386  0.0917546085589852  !   O 31
  0.7268034839149164  0.9074318918717618  0.5919982177966845  !   O 32
  0.9630604679600919  0.9795980675156690  0.2612526320192473  !   O 33
  0.9630912707186527  0.9804995968322487  0.7614574501246922  !   O 34
  0.5261765035865646  0.9777158543488299  0.2613113026519991  !   O 35
  0.5264236150187530  0.9785116440802124  0.7615566146330760  !   O 36
  0.8913617615404948  0.7721820384388214  0.2308060240528116  !   O 37
  0.8917143507518773  0.7722919070249790  0.7309905232859238  !   O 38
  0.4944035362630213  0.7692207011350506  0.2279691408755182  !   O 39
  0.4939941797077887  0.7691937702572762  0.7280706376784744  !   O 40
  0.9720727911364467  0.8147475329909236  0.4759195937277313  !   O 41
  0.9721156212703318  0.8150197319692353  0.9756499236771080  !   O 42
  0.4364168709255045  0.8161601108620860  0.4738892374363887  !   O 43
  0.4364562481569679  0.8164184671426239  0.9735825791979374  !   O 44
  0.9155102422319800  0.5926856736553917  0.0288332502914128  !   O 45
  0.9154979783730705  0.5926300829865471  0.5289578428877402  !   O 46
  0.3817522880864018  0.6043857651787646  0.0376318901566861  !   O 47
  0.3817160543137474  0.6042374780435397  0.5376893080969934  !   O 48
  0.8769420718502774  0.5697560417825575  0.2875855124316236  !   O 49
  0.8768979398345339  0.5697431069870185  0.7874643113843084  !   O 50

论坛徽章:
1
子鼠
日期:2013-12-02 22:34:22
2 [报告]
发表于 2012-12-03 22:02 |只看该作者
回复 1# kernel69
$curpos=tell DATA;
@push=grep {/O\s[53]\b/} <DATA>;
seek(DATA,$curpos,0);
while (<DATA>)
{
   print ,next if /LTO/../Direct/;
   print @push;
   print;
   last;
}




while(<DATA>)

  print if !/O\s[53]\b/;
}




__DATA__
LTO-112                                 
   1.00000000000000     
     7.7228425617038052   -1.1728241973308142    0.0000783765917769
     0.0154894469072108   13.1856961357670865    0.0030255004255562
     0.0005099584114049    0.0025575613443815   11.1620206915956075
   N    O    Ti   La
     2    54    16    16
Direct
  0.7774215004064313  0.1115183520588823  0.3975691032523719  !   O 1
  0.7771581464215501  0.1089297591197067  0.9024626546976567  !   O 2  
  0.2724167356846352  0.0892053653452632  0.3395504485160841  !   O 3  
  0.2730739211704762  0.0920101685285890  0.8424744814611309  !   O 4  
  0.0375063320525867  0.0189181619988713  0.0113650832426271  !   O 5  
  0.0365639745275992  0.0190801381676232  0.5117751570324968  !   O 6  
  0.4726361611294826  0.0208567905544868  0.0114666074551770  !   O 7  
  0.4740039724211500  0.0212090000784555  0.5117259506938966  !   O 8  
  0.1102180912358619  0.2287966682670296  0.4808739940375588  !   O 9  
  0.1082787292444457  0.2277465339852076  0.9808863659422654  !   O 10 
  0.5047713377152230  0.2322004469818953  0.4780386588074450  !   O 11 
  0.5059567860449274  0.2308850118864839  0.9778788455825969  !   O 12 
  0.0306657407452050  0.1855576162473936  0.2249739665642037  !   O 13 
  0.0286688753220992  0.1850095370859427  0.7261973101857051  !   O 14 
  0.5607981933228251  0.1842478667545847  0.2227362284969601  !   O 15 
  0.5628436290100254  0.1835949663173362  0.7241398630945840  !   O 16 
  0.0844940391742547  0.4075450250314948  0.2786555919397753  !   O 17 
  0.0847144095905826  0.4075106445105974  0.7788453294753575  !   O 18 
  0.6183352817388390  0.3960686664334347  0.2872963146044206  !   O 19 
  0.6182086687431423  0.3958656917719918  0.7875423740163315  !   O 20 
  0.1233091378066253  0.4304550605450148  0.0371544327048564  !   O 21 
  0.1231592688039196  0.4307100191731379  0.5376665959498181  !   O 22 
  0.5958927121806848  0.4398154592128560  0.0427595519777654  !   O 23 
  0.5961285549301263  0.4400608080615391  0.5433837235740554  !   O 24 
  0.3278880279280379  0.3088022264155676  0.1671011844098544  !   O 25 
  0.3279347411765126  0.3086165081646174  0.6678438914641215  !   O 26 
  0.8262572705420765  0.3052066878686089  0.1064335068510608  !   O 27 
  0.8263419867565519  0.3053722289679932  0.6070010296661088  !   O 28 
  0.2227088528521967  0.8903249303209398  0.1519725028946477  !   O 29 
  0.2228805336352401  0.8910382005582520  0.6525961852954097  !   O 30 
  0.7270069998272813  0.9081857062726386  0.0917546085589852  !   O 31 
  0.7268034839149164  0.9074318918717618  0.5919982177966845  !   O 32 
  0.9630604679600919  0.9795980675156690  0.2612526320192473  !   O 33 
  0.9630912707186527  0.9804995968322487  0.7614574501246922  !   O 34 
  0.5261765035865646  0.9777158543488299  0.2613113026519991  !   O 35 
  0.5264236150187530  0.9785116440802124  0.7615566146330760  !   O 36 
  0.8913617615404948  0.7721820384388214  0.2308060240528116  !   O 37 
  0.8917143507518773  0.7722919070249790  0.7309905232859238  !   O 38 
  0.4944035362630213  0.7692207011350506  0.2279691408755182  !   O 39 
  0.4939941797077887  0.7691937702572762  0.7280706376784744  !   O 40 
  0.9720727911364467  0.8147475329909236  0.4759195937277313  !   O 41 
  0.9721156212703318  0.8150197319692353  0.9756499236771080  !   O 42 
  0.4364168709255045  0.8161601108620860  0.4738892374363887  !   O 43 
  0.4364562481569679  0.8164184671426239  0.9735825791979374  !   O 44 
  0.9155102422319800  0.5926856736553917  0.0288332502914128  !   O 45 
  0.9154979783730705  0.5926300829865471  0.5289578428877402  !   O 46 
  0.3817522880864018  0.6043857651787646  0.0376318901566861  !   O 47 
  0.3817160543137474  0.6042374780435397  0.5376893080969934  !   O 48 
  0.8769420718502774  0.5697560417825575  0.2875855124316236  !   O 49 
  0.8768979398345339  0.5697431069870185  0.7874643113843084  !   O 50
很笨的办法。
   

论坛徽章:
8
双子座
日期:2013-08-31 07:37:12金牛座
日期:2013-09-09 18:49:12处女座
日期:2013-09-23 11:43:14处女座
日期:2013-10-09 19:48:21狮子座
日期:2014-03-24 18:22:12丑牛
日期:2014-04-22 22:07:51申猴
日期:2014-06-12 21:54:13双鱼座
日期:2014-06-13 21:52:31
3 [报告]
发表于 2012-12-03 22:57 |只看该作者
Direct下面紧接的是这2行,然后才是其他的
  0.2724167356846352  0.0892053653452632  0.3395504485160841  !   O 3
  0.0375063320525867  0.0189181619988713  0.0113650832426271  !   O 5回复 2# erpeng_1988


   

论坛徽章:
33
荣誉会员
日期:2011-11-23 16:44:17天秤座
日期:2014-08-26 16:18:20天秤座
日期:2014-08-29 10:12:18丑牛
日期:2014-08-29 16:06:45丑牛
日期:2014-09-03 10:28:58射手座
日期:2014-09-03 16:01:17寅虎
日期:2014-09-11 14:24:21天蝎座
日期:2014-09-17 08:33:55IT运维版块每日发帖之星
日期:2016-04-17 06:23:27操作系统版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-24 06:20:0015-16赛季CBA联赛之天津
日期:2016-05-06 12:46:59
4 [报告]
发表于 2012-12-04 00:23 |只看该作者
我没明白这样做的目的.

单就程序来说, 上面的兄弟处理得已经很好了.

在我看来, 这样的程序最好不要 硬编码 'O 3' 'O 5' 这样的具体内容, 应该更通用一点.

所以, 最好能知道为啥是 'O 3', 'O 5'.  

论坛徽章:
1
子鼠
日期:2013-12-02 22:34:22
5 [报告]
发表于 2012-12-05 13:26 |只看该作者
回复 4# q1208c
也可以写成变量来获取参数。不过数据量很大的话这样处理有点罗嗦,看各位有没更好的办法。

   

论坛徽章:
0
6 [报告]
发表于 2012-12-05 17:31 |只看该作者
回复 2# erpeng_1988


    要的是perl命令行实现吧

论坛徽章:
1
子鼠
日期:2013-12-02 22:34:22
7 [报告]
发表于 2012-12-05 22:28 |只看该作者
回复 6# sjdy521
有更简便的方法没


   

论坛徽章:
0
8 [报告]
发表于 2012-12-05 23:27 |只看该作者
感觉和做作业一样。

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
9 [报告]
发表于 2012-12-06 14:16 |只看该作者
Bu 简便 的 方法:
  1. #!/usr/bin/perl -l
  2. my @d = ( 3, 5 );
  3. my %t = map { $_, 1 } @d;
  4. local $/;
  5. my ( $a, $b, $c ) = split /(Direct)/, <DATA>;
  6. my @c = split /\n/, $c, $d[-1] + 2;
  7. print for $a . $b, @c[ @d, grep { !$t{$_} } 1 .. $#c ];
复制代码

论坛徽章:
1
金牛座
日期:2013-09-06 08:50:31
10 [报告]
发表于 2012-12-08 16:03 |只看该作者
回复 2# erpeng_1988
本人菜鸟,想问一下print ,next if /LTO/../Direct/;是什么意思。



   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP