是否可以使用grep函数过滤Real数字的文本文件?

时间:2017-07-12 13:01:39

标签: perl unix

我正在尝试过滤文件中以特定数字或小于该特定数字开头的行的文本文件。 是否可以使用grep函数实现这一点?

我尝试编写一个Perl脚本来执行此操作,然后我下载了用于捕获实数的模块,但它似乎无法正常工作。 这是我的Perl脚本:

#!/usr/bin/perl 
use strict;
use warnings;
use Regexp::Common qw /number/;

    while (<>) {
        /^$RE{num}{int}$/                and  print "Integer\n";
        /^$RE{num}{real}$/               and  print "Real\n";
        /^$RE{num}{real}{-base => 16}$/  and  print "Hexadecimal real\n";
    }

print "Enter limit: ";
chomp( my $limit = <STDIN> );
$limit = abs($limit);

open my $IN, '<', "xt_spacer_results.hairpin" or die $!;
open my $SIFTED, '>', "new_xt_spacer_results.hairpin" or die $!;

   while (<$IN>){
        next if /^None/;
        next if /^($RE{num}{real}{-places=>2})/ && $1 <= $limit;
    print $SIFTED $_;
    }

close $IN;
close $SIFTED;

编辑:文本文件的格式为:

序列ID

(能量值)7个空格(start_pos)2个点6个空格(end_pos)3个空格(left-flank-seq)空格(回文 - seq-空格)(右侧-seq)

>hsa_circ_0067224|chr3:128345575-128345675-|NM_002950|RPN1  FORWARD
(-4.4)       (6) ..      (17)   (xxxxxxxxxxGTGAC)                (CAGT ATGC ACTG)                 
(AAGATGAGGTTTGTG)
-0.9       5 ..      18   xxxxxxxxxxxGTGA               CCAGT ATGC ACTGA                
AGATGAGGTTTGTGG
None       3 ..      22   xxxxxxxxxxxxxGT             GACCAGTATGCACTGAAGAT              
GAGGTTTGTGGACCA
-2.3       5 ..      26   xxxxxxxxxxxGTGA           C CAGTATGCACTGAAGATGAG G            
TTTGTGGACCATGTG
-3.2       4 ..      27   xxxxxxxxxxxxGTG          AC CAGTATGCACTGAAGATGAG GT           TTGTGGACCATGTGT
-1.9       3 ..      28   xxxxxxxxxxxxxGT         GAC CAGTATGCACTGAAGATGAG GTT          TGTGGACCATGTGTT

所以我的脚本应该过滤掉所有能量等级,以及所有低于用户输入值的能量等级。 如果用户输入值-2,则使用上面的示例,以下将是过滤的结果:

>hsa_circ_0067224|chr3:128345575-128345675-|NM_002950|RPN1  FORWARD
-4.4       6 ..      17   xxxxxxxxxxGTGAC                CAGT ATGC ACTG                 
AAGATGAGGTTTGTG
-2.3       5 ..      26   xxxxxxxxxxxGTGA           C CAGTATGCACTGAAGATGAG G            
TTTGTGGACCATGTG
-3.2       4 ..      27   xxxxxxxxxxxxGTG          AC CAGTATGCACTGAAGATGAG GT           TTGTGGACCATGTGT

所有&#39;无&#39;与-1.9和-0.9一起被删除,因为它们不够低。

1 个答案:

答案 0 :(得分:3)

是。 Perl grep函数可以根据任意条件进行过滤,而不仅仅是正则表达式:

#!/usr/bin/env perl    

use strict;
use warnings;
use 5.010;

use Scalar::Util 'looks_like_number';

my @lines = <DATA>;

my @small_numbers = grep { looks_like_number($_) && $_ < 3.1416 } @lines;

print for @small_numbers;

__DATA__
Foo
17
1.387531
0
2
3 and a bit

输出:

1.387531
0
2
如果您确信您的数据是严格数字的,那么

Scalar::Utillooks_like_number可以省略,但问题中包含的代码意味着您至少有一种可能非数字值(&#34;无&#34;)。