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
应该不会这么简单吧?
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
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