perl - 是否可以使用 grep 函数过滤文本文件中的实数?

标签 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)空格(palindrome-seq-spaces)(right-flank-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

所有“无”以及 -1.9 和 -0.9 都被删除,因为它们不够低。

最佳答案

是的。 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 ,但问题中包含的代码暗示您至少有一个可能的非数字值(“无”)。

关于perl - 是否可以使用 grep 函数过滤文本文件中的实数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45058421/

相关文章:

c - 接收未声明的 SIGALRM SIGSTP 错误消息,尽管我已包含 <signal.h>

linux - 如何在 Perl 中使用正则表达式

bash - 根据文件的第二列对数据进行排序

ruby - 删除文件中第二个文件中没有匹配项的行的最快方法是什么?

perl - 在 Perl 中查找空白索引

linux - 在文件中查找搜索字符串并打印同一行中的下一个单词

Linux 堆栈驻留内存在堆栈展开后未回收

c# - Mono (Linux) 中带有 Args 的 Process.Run(),不启动进程

Perl 从标量或数组修剪空间

performance - 在 Perl 中更快地搜索文件