Chinaunix

标题: 从文件获取某一特定行的前面一行 [打印本页]

作者: TrishaTie    时间: 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, 读取下一行,先判断是不是“.”, 如果不是,覆盖前面保存,如果是输出,但不清楚怎么实现,希望大家出出注意,也可以帮忙提供别的思路。
先行谢过!
作者: kernel69    时间: 2014-07-14 16:03
应该不会这么简单吧?
  1. perl -ne '/\.{3}$/ and print'
复制代码
回复 1# TrishaTie


   
作者: q1208c    时间: 2014-07-14 16:11

egrep -B1 '^\.'
作者: jason680    时间: 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...)
作者: TrishaTie    时间: 2014-07-14 17:28
回复 4# jason680

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

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

   
作者: TrishaTie    时间: 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...
.

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


作者: TrishaTie    时间: 2014-07-14 17:40
回复 3# q1208c


    大神,真不好意思,这个没懂是怎么实现的? egrep -B1 '^\.'   我还需要多花点时间来学习。。。
作者: sxlwzl    时间: 2014-07-15 08:29
回复 2# kernel69


    大神,perl还有这种用法呀,从哪里可以看到详细的用法?
作者: kernel69    时间: 2014-07-15 09:50
  1. perldoc perlrun
复制代码
回复 8# sxlwzl


   
作者: sxlwzl    时间: 2014-07-15 14:23
回复 9# kernel69

s收到,谢谢大神
   
作者: hubenxia    时间: 2014-07-23 10:55
#!/usr/bin/perl -w
open OUT1,">out1.txt";
open IN1,"<1.txt";
my @seq;
while (<IN1>) {
        chomp;
        push @seq,$_;
}
for ($i=0;$i<@seq;$i++) {
        if ($seq[$i]=~/^\./) {
                print "$seq[$i-1]\n";
                print OUT1 "$seq[$i-1]\n";

        }
}
close IN1;
close OUT1;




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2