我正在尝试过滤文件中以特定数字或小于该特定数字开头的行的文本文件。 是否可以使用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一起被删除,因为它们不够低。
答案 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::Util
和looks_like_number
可以省略,但问题中包含的代码意味着您至少有一种可能非数字值(&#34;无&#34;)。