
다음과 같은 파일이 있습니다
a 0 gene1 56 0 6S32M12S *
b 256 gene2 56 0 6S32M12S *
c 256 gene3 55 0 6S27M17S *
d 16 gene4 110 9 19S25M6S *
e 272 gene5 141 9 23S21M6S *
f 272 gene6 139 9 24S20M6S *
g 0 gene7 38 1 6S44M *
h 256 gene8 38 1 6S44M *
I 256 gene9 38 1 6S44M *
j 256 gene10 40 1 8S42M *
6번째 열은 필터링하려는 문자열입니다. 기본적으로 문자열에 16S(16S,17S,18S,19S 등) 이상의 일치 항목이 포함된 경우 해당 행을 보고합니다. 어떻게 해야 합니까? 위 예의 출력은 다음과 같습니다.
c 256 gene3 55 0 6S27M17S *
d 16 gene4 110 9 19S25M6S *
e 272 gene5 141 9 23S21M6S *
f 272 gene6 139 9 24S20M6S *
방금 큰 파일의 일부를 보여드렸습니다.
답변1
perl -ane 'print if grep {$_ >= 16} ($F[5] =~ /(\d+)S/g)' file
출력
c 256 gene3 55 0 6S27M17S *
d 16 gene4 110 9 19S25M6S *
e 272 gene5 141 9 23S21M6S *
f 272 gene6 139 9 24S20M6S *
그러면 6번째 필드에서 "S"가 뒤에 오는 모든 숫자를 찾습니다. 16보다 크거나 같으면 행을 인쇄합니다.
-n
에서 찾아보세요perldoc perlrun
Perl이 단일 라이너로 무엇을 하는지 확인하는 멋진 방법 중 하나는 옵션을 추가하는 것입니다.-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
보다
http://perldoc.perl.org/B/Deparse.html
http://perldoc.perl.org/O.html
한 줄짜리 내용을 스크립트로 확장하여 설명하겠습니다.
#!/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;
답변2
두 번째 S
도 중요하다고 가정하면 다음과 같습니다.
awk '{
split ($6, nums, /S([0-9]+M)?/);
for (i in nums)
if (nums[i] > 16)
{ print; next }
}' test.txt