문자열을 기준으로 파일 필터링

문자열을 기준으로 파일 필터링

다음과 같은 파일이 있습니다

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   *

여섯 번째 열은 필터링하려는 문자열입니다. 기본적으로 문자열에 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    *

이렇게 하면 "S"가 뒤에 오는 6번째 필드의 모든 숫자를 찾습니다. 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

관련 정보