폭발 결과에서 적중 및 무적중 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