我正在尝试过滤文本文件,以查找文件中以特定数字或小于该特定数字开头的行。 是否可以使用 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::Util
和 looks_like_number
,但问题中包含的代码暗示您至少有一个可能的非数字值(“无”)。
关于perl - 是否可以使用 grep 函数过滤文本文件中的实数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45058421/