동일한 텍스트 파일 내의 다른 줄에 나타나는 시퀀스 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
awk
Ruby와 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 솔루션을 사용하세요 :).