다른 파일에 있는 각 쿼리의 두 번째 줄을 인쇄해야 합니다.

다른 파일에 있는 각 쿼리의 두 번째 줄을 인쇄해야 합니다.

폭발 결과에서 적중 및 무적중 ID를 추출하고 싶습니다.

예를 들어 내 폭발 출력에는 다음이 포함됩니다.

> Query= TRINITY_DN109574_c0_g1_i1

Length=277
***** No hits found *****
Lambda      K        H        a         alpha
   0.318    0.134    0.401    0.792     4.96 
Gapped
Lambda      K        H        a         alpha    sigma
   0.267   0.0410    0.140     1.90     42.6     43.6 
Effective search space used: 749080088160

> Query= TRINITY_DN109587_c0_g1_i1

Length=312
***** No hits found *****
Lambda      K        H        a         alpha
   0.318    0.134    0.401    0.792     4.96 
Gapped
Lambda      K        H        a         alpha    sigma
   0.267   0.0410    0.140     1.90     42.6     43.6

> Query= TRINITY_DN109586_c0_g2_i1

Length=472

Sequences producing significant alignments:                          
                                    (Bits)  Value
protein LOC111635341 n=1...  104     1e-23
  UniRef90_UPI000C6CD8E3 uncharacterized protein LOC111632564 n=1...  103     1e-23
  UniRef90_UPI000C6CAADE uncharacterized protein LOC111636326 n=1...  103     3e-23

나는 다음과 같은 것을 원합니다 :

TRINITY_DN109574_c0_g1_i1          No hits
TRINITY_DN109587_c0_g1_i1          No hits 
TRINITY_DN109586_c0_g2_i1          Sequences producing significant alignments: 

이는 다른 파일에 있는 각 쿼리의 두 번째 줄을 인쇄해야 함을 의미합니다.

답변1

sed -E "/^$/d" file | awk '/> Query/{printf "%s\t", $3; nr[NR+2]}; NR in nr '

산출

TRINITY_DN109574_c0_g1_i1       ***** No hits found *****
TRINITY_DN109587_c0_g1_i1       ***** No hits found *****
TRINITY_DN109586_c0_g2_i1       Sequences producing significant alignments:

송곳...

귀하의 ID와 히트 라인 간격은 히트 여부에 따라 달라지지만, 여분의 빈 행에 의해서만 간격이 달라지므로 빈 행을 모두 제거하면

sed -E "/^$/d" file 

그런 다음 적중/실패 행은 항상 쿼리 앞의 2개 행입니다. 그런 다음 파이프를 |통해 awk쿼리로 시작하는 행만 찾습니다.

awk '/> Query/'

$3하지만 쿼리 행에는 세 번째(공백으로 구분된) 필드만 필요합니다. 이것이 귀하의 ID이기 때문입니다.

awk '/> Query/{print $3}'

정규식 일치 항목을 찾을 때마다 일치하는 Hits 줄의 줄 번호를 계산하여 배열에 저장하려고 합니다. 나는 배열을 호출했고 nr우리가 관심 있는 Hits 행은 현재 일치하는 행 NR+ 2 입니다.

awk '/> Query/{print $3; nr[NR+2]}'

NR마지막으로 두 번째 조건을 추가하여 정규식과 일치하지 않는 행이 배열에 있는지 확인 nr하고 인쇄합니다. 또한 ID 끝 부분에 Hits를 출력하도록 첫 번째 항목을 print변경하십시오 .printf

awk '/> Query/{printf "%s\t", $3; nr[NR+2]}; NR in nr;'

NR다음 정규식 일치보다 더 많은 숫자를 추가하면 이 솔루션이 중단됩니다 .

답변2

GNU sed를 사용하여 쿼리 라인부터 시작하여 패턴 공간에 라인을 누적하고, 계속해서 빈 라인을 버리고, 비어 있지 않은 라인 3개가 누적되면 인쇄합니다.

$ sed -e '
    :loop
        /\n.*\n/{
            s//\t/
            s/^> Query=//p
         }
         /^> Query=/!d
         $d;N
         s/\n$//
     bloop
' file

Perl을 사용하여 파일을 읽고 쿼리 줄을 가져오고, 빈 줄을 건너뛰고, 비어 있지 않은 첫 번째 줄을 건너뜁니다.

$ perl -0777ne 'print "$1\t$2" while /^> Query=\h+(.*)\n\n*.*\n\n*(.*\n)/mg' file

답변3

PCRE 모드에서 GNU grep을 사용하여 먼저 쿼리 줄을 추출한 다음 비어 있지 않은 2줄을 추출하고 가운데 빈 줄의 범위는 0부터 배수까지 가능합니다.

$ < file grep -zoP '(?m:^> Query=\h+\K.*\n\n*(.*\n\n*){2})' |
    tr -d '\0' | tr -s '\n' |
    sed -e 'h;n;n;H;g;s/\n/\t/'

범위 연산자를 사용하는 또 다른 방법 ...:

$ perl -lane '
    $e = (/^> Query=/ && $c==0) ... (/\S/ && $c==2);
    next if !length($e) || !@F;
    $q = $F[2]       if $e == 1;
    print "$q\t$_" if $e =~ /E0/;
    $c = $c == 2 ? 0 : $c+1;
  ' file 

관련 정보