2011-06-10 32 views
1

我有一个文件内的一个文件,它是存在以下选择周围围绕着丢失的序列号线

TEST_4002_sample11_1_20110531.TXT 
TEST_4002_sample11_2_20110531.TXT 
TEST_4002_sample11_4_20110531.TXT 
TEST_4002_sample11_5_20110531.TXT 
TEST_4002_sample11_6_20110531.TXT 
TEST_4002_sample10_1_20110531.TXT 
TEST_4002_sample10_2_20110531.TXT 
TEST_4002_sample10_4_20110531.TXT 
TEST_4002_sample10_5_20110531.TXT 

我想,如果提起该文件序列的第4个缺少输出给定,然后打印一个文件名称和下一个文件名称作为输出。

TEST_4002_sample11_2_20110531.TXT 
TEST_4002_sample11_4_20110531.TXT 
TEST_4002_sample10_2_20110531.TXT 
TEST_4002_sample10_4_20110531.TXT 
+1

嗯。我真的不明白你为什么关闭这个问题。这是具体解决方案的真实世界编程问题(正如你在答案中看到的那样)。提供了示例输入和所需输出。 – jm666 2011-06-14 07:19:24

回答

1

这awk的变种似乎产生所需的输出:

awk -F_ '$4>c+1{print p"\n"$0}{p=$0;c=$4}' 
+0

您给出的非常简单的perl脚本。感谢您的回应 – gyrous 2011-06-14 04:52:01

+0

这不是Perl,它是awk。 – Qtax 2011-06-14 05:30:51

0

在Perl中,你可以做这样的事情:

use strict; 
use warnings; 

my $prev_line; 
my $prev_val; 

while(<>){ 
    # get the 4th value 
    my $val = (split '_')[3]; 

    # skip if invalid line 
    next if !defined $val; 

    # print if missed sequence 
    if(defined($prev_val) && $val > $prev_val + 1){ 
     print $prev_line . $_; 
    } 

    # save for next iteration 
    $prev_line = $_; 
    $prev_val = $val; 
} 

保存在foo.pl并且用类似运行:

cat file.txt | perl foo.pl 

我敢肯定,这可以缩短了很多。可以使用这样的事情,如果所有的线条都有效:

perl -n -e '$v=(/[^_]/g)[3];print"$l$_"if$l&&$v>$p+1;$p=$v;$l=$_' file.txt 

perl -naF_ -e '$v=$F[3];print"$l$_"if$l&&$v>$p+1;$p=$v;$l=$_' file.txt 
+0

感谢您的回复 – gyrous 2011-06-14 04:51:03

0

据我知道你需要什么,这里是一个Perl脚本,做的工作:

#!/usr/local/bin/perl 
use strict; 
use warnings; 

my $prev = ''; 
my %seq1; 
while(<DATA>) { 
    chomp; 
    my ($seq1, $seq2) = $_ =~ /^.*?(\d+)_(\d+)_\d+\.TXT$/; 
    $seq1{$seq1} = $seq2 - 1 unless exists $seq1{$seq1}; 
    if ($seq1{$seq1}+1 != $seq2) { 
     print $prev,"\n",$_,"\n"; 
    } 
    $prev = $_; 
    $seq1{$seq1} = $seq2; 
} 


__DATA__ 
TEST_4002_sample11_1_20110531.TXT 
TEST_4002_sample11_2_20110531.TXT 
TEST_4002_sample11_4_20110531.TXT 
TEST_4002_sample11_5_20110531.TXT 
TEST_4002_sample11_6_20110531.TXT 
TEST_4002_sample10_1_20110531.TXT 
TEST_4002_sample10_2_20110531.TXT 
TEST_4002_sample10_4_20110531.TXT 
TEST_4002_sample10_5_20110531.TXT 

输出:

TEST_4002_sample11_2_20110531.TXT 
TEST_4002_sample11_4_20110531.TXT 
TEST_4002_sample10_2_20110531.TXT 
TEST_4002_sample10_4_20110531.TXT 
0

我以前glob需要的档案(这是可能的,它是作为<TEST_*.TXT>一样简单)。

use strict; 
use warnings; 

my %last = (name => '', group => '', seq => 0); 

foreach my $file (sort glob('TEST_[0-9][0-9][0-9][0-9]_sample[0-9][0-9]_[0-9]_*.TXT') 
    ) { 
    my ($group, $seq) = $file =~ m/(\d{4,}_sample\d+)_(\d+)/; 
    if ($group eq $last{group} && $seq - $last{seq} > 1) { 
     print join("\n", $last{name}, $file, ''); 
    } 
    @last{ qw<name group seq> } = ($file, $group, $seq); 
} 
1

简单的Perl方式:

perl -F_ -lane 'print "$o\n$_" if $F[3]-$n>1;$o=$_;$n=$F[3]' < file 
+0

感谢您的perl命令。 – gyrous 2011-06-14 04:50:48