동일한 텍스트 파일 내에서 서로 다른 줄에 나타나는 여러 비트의 정보를 추출하는 방법

동일한 텍스트 파일 내에서 서로 다른 줄에 나타나는 여러 비트의 정보를 추출하는 방법

동일한 텍스트 파일 내의 다른 줄에 나타나는 시퀀스 ID와 클러스터 번호를 추출하려고 합니다.

입력은 다음과 같습니다.

>Cluster 72
0   319aa, >O311_01007... *
>Cluster 73
0   318aa, >1494_00753... *
1   318aa, >1621_00002... at 99.69%
2   318aa, >1622_00575... at 99.37%
3   318aa, >1633_00422... at 99.37%
4   318aa, >O136_00307... at 99.69%
>Cluster 74
0   318aa, >O139_01028... *
1   318aa, >O142_00961... at 99.69%
>Cluster 75
0   318aa, >O300_00856... *

원하는 출력은 한 열의 시퀀스 ID와 두 번째 열의 해당 클러스터 번호입니다.

>O311_01007  72
>1494_00753  73
>1621_00002  73
>1622_00575  73
>1633_00422  73
>O136_00307  73
>O139_01028  74
>O142_00961  74
>O300_00856  75

누구든지 도와줄 수 있나요?

답변1

awk로:

awk -F '[. ]*' 'NF == 2 {id = $2; next} {print $3, id}' input-file
  • 공백이나 마침표로 필드를 분할합니다.-F '[. ]*'
  • 두 필드의 줄(라인 >Cluster)을 사용하여 두 번째 필드를 ID로 저장하고 다음 줄로 이동합니다.
  • 다른 줄에서는 세 번째 필드와 저장된 ID를 인쇄합니다.

답변2

다음을 위해 사용할 수 있습니다 awk:

awk '/>Cluster/{
      c=$2;
      next
    }{
      print substr($3,2,length($3)-4), c
    }' file

첫 번째 블록 문은 클러스터 ID를 캡처합니다. 두 번째 블록 문(기본값)은 원하는 데이터를 추출하여 인쇄합니다.

답변3

Ruby를 한 줄로 사용하는 대안은 다음과 같습니다.

ruby -ne 'case $_; when /^>Cluster (\d+)/;id = $1;when /, (>\w{4}_\w{5})\.\.\./;puts "#{$1} #{id}";end' input_file

또는 여러 줄로 퍼뜨립니다.

ruby -ne 'case $_
when /^>Cluster (\d+)/
  id = $1
when /, (>\w{4}_\w{5})\.\.\./
  puts "#{$1} #{id}"
end' input_file

awkRuby와 regexen을 알고 있다면 버전 보다 더 읽기 쉬울 것 같습니다 . 보너스로 이 코드는 주변 텍스트를 찾기 때문에 단순히 줄을 나누는 것보다 조금 더 강력할 수 있습니다.

답변4

펄:

$ perl -ne 'if(/^>.*?(\d+)/){$n=$1;}else{ s/.*(>[^.]+).*/$1 $n/; print}' file 
>O311_01007 72
>1494_00753 73
>1621_00002 73
>1622_00575 73
>1633_00422 73
>O136_00307 73
>O139_01028 74
>O142_00961 74
>O300_00856 75

설명

  • perl -ne: 입력 파일을 한 줄씩 읽고( -n) 각 줄에 주어진 스크립트를 적용합니다 -e.
  • if(/^>.*?(\d+)/){$n=$1;}: 이 줄이 a로 시작하는 경우 >줄 끝에서 가장 긴 숫자를 찾아 로 저장합니다 $n.
  • else{ s/.*(>[^.]+).*/$1 $n/; print: 줄이 로 시작하지 않으면 모든 것을 ( ) 뒤에 오는 >비문자의 가장 긴 부분으로 바꿉니다. 즉 , 시퀀스 이름(.>>[^.]+$1캡처정규식 일치) 및 현재 값 $n.

또는 좀 더 색다른 접근 방식을 사용하려면 다음을 수행하세요.

$ perl -lane 'if($#F==1){$n=$F[1]}else{$F[2]=~s/\.+$//; print "$F[2] $n"}' file 
>O311_01007 72
>1494_00753 73
>1621_00002 73
>1622_00575 73
>1633_00422 73
>O136_00307 73
>O139_01028 74
>O142_00961 74
>O300_00856 75

이는 다양한 접근 방식과 동일한 기본 아이디어를 수행하는 약간 더 번거로운 방법일 뿐입니다 awk. 완성도를 높이고 Perl 팬을 위해 포함시켰습니다. 설명이 필요하면 awk 솔루션을 사용하세요 :).

관련 정보