免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4294 | 回复: 10

从文件获取某一特定行的前面一行 [复制链接]

论坛徽章:
0
发表于 2014-07-14 15:39 |显示全部楼层
有一个这样的输入文件:
"*000000003040d059-08cec8cb3f1faa5d.lab"
0 300000 sil[2] 43.327358 sil 312.297211 <s>
300000 1100000 sil[4] 159.858444
1100000 2300000 sil[2] 285.421143
2300000 2800000 sil[4] 31.335995
2800000 5000000 sil[3] -206.881500...
.
"*0000003040dddf-08cec8cc9ba7cf8b.lab"
0 100000 sil[2] -12.378605 sil -12.429898 <s>
100000 200000 _noise_[2] -19.594048 _noise_ -69.169189 [NOPREFIX]
200000 300000 _noise_[3] -24.245062
300000 400000 _noise_[4] -25.330078
400000 500000 m_s2_6 -27.062466 sil-m+ay -50.816406 MY
500000 600000 m_s3_72 -20.093945
600000 700000 m_s4_58 -3.659996
700000 1100000 ay_s2_36 32.874966 m-ay+ae 67.047241...
.
我想获取"."行 前面的一行 (已标红), 而“.lab”下面到“.”这一行有的文件会有很多行。

我自己的一个思路是每一部分放到数组实现。
还有一个思路是用hash, 每读取一行先保存进hash, 读取下一行,先判断是不是“.”, 如果不是,覆盖前面保存,如果是输出,但不清楚怎么实现,希望大家出出注意,也可以帮忙提供别的思路。
先行谢过!

论坛徽章:
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
发表于 2014-07-14 16:03 |显示全部楼层
应该不会这么简单吧?
  1. perl -ne '/\.{3}$/ and print'
复制代码
回复 1# TrishaTie


   

论坛徽章:
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
发表于 2014-07-14 16:11 |显示全部楼层

egrep -B1 '^\.'

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
发表于 2014-07-14 16:46 |显示全部楼层
回复 1# TrishaTie

use strict;
use warnings;

my $sLast = "";
while(<DATA>){
  chomp;
  if(m/^[.]/){
    print "$sLast\n";
  }
  $sLast = $_;

}


__DATA__
"*000000003040d059-08cec8cb3f1faa5d.lab"
...(your data...)

论坛徽章:
0
发表于 2014-07-14 17:28 |显示全部楼层
回复 4# jason680

非常谢谢大神,最终代码:

my $sLast = "";
while(<INF>)
{
       chomp;
       if(/\.lab/)
        {
                print OUT $_."\n";
        }
         if(m/^[.]/)
         {
                       print OUT "$sLast\n";
         }
       $sLast = $_;
}

   

论坛徽章:
0
发表于 2014-07-14 17:37 |显示全部楼层
回复 2# kernel69


   哈哈,是木有那么简单,这里我写的有点歧义,

"*000000003040d059-08cec8cb3f1faa5d.lab"
0 300000 sil[2] 43.327358 sil 312.297211 <s>
300000 1100000 sil[4] 159.858444
1100000 2300000 sil[2] 285.421143
2300000 2800000 sil[4] 31.335995
2800000 5000000 sil[3] -206.881500...
.

那个红点表示下面还有很多行, 我怕跟下面的一个点弄混就写上面了。

论坛徽章:
0
发表于 2014-07-14 17:40 |显示全部楼层
回复 3# q1208c


    大神,真不好意思,这个没懂是怎么实现的? egrep -B1 '^\.'   我还需要多花点时间来学习。。。

论坛徽章:
0
发表于 2014-07-15 08:29 |显示全部楼层
回复 2# kernel69


    大神,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
发表于 2014-07-15 09:50 |显示全部楼层
  1. perldoc perlrun
复制代码
回复 8# sxlwzl


   

论坛徽章:
0
发表于 2014-07-15 14:23 |显示全部楼层
回复 9# kernel69

s收到,谢谢大神
   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP