perl -ane 'print if grep {$_ >= 16} ($F[5] =~ /(\d+)S/g)' file
saídas
c 256 gene3 55 0 6S27M17S *
d 16 gene4 110 9 19S25M6S *
e 272 gene5 141 9 23S21M6S *
f 272 gene6 139 9 24S20M6S *
Isso encontra todos os dígitos seguidos por "S" no 6º campo. Se algum for maior ou igual a 16, imprime a linha.
Procure -n
em perldoc perlrun
Uma forma legal de ver o que o perl está fazendo com um único liner é adicionar a opção -MO=Deparse
$ perl -MO=Deparse -ane 'print if grep {$_ >= 16} ($F[5] =~ /(\d+)S/g)'
LINE: while (defined($_ = <ARGV>)) {
our(@F) = split(' ', $_, 0);
print $_ if grep {$_ >= 16;} $F[5] =~ /(\d+)S/g;
}
-e syntax OK
Vou explicar expandindo o one-liner em um script:
#!/usr/bin/env perl
my $filename = shift @ARGV;
open my $fh, '<', $filename or die $!;
while (defined($_ = <$fh>)) {
my @F = split(' ', $_, 0);
my @s_numbers = $F[5] =~ /(\d+)S/g;
if (grep {$_ >= 16;} @s_numbers) {
print $_;
}
}
close $fh;