도움을 요청하기 전에 게시했습니다. 문자열의 발생 횟수를 계산합니다.. 이제 특정 값 범위 내에서 문자열 발생을 검색하고 비슷한 형식의 파일을 인쇄하고 싶습니다(아래 범위는 범위의 초기 숫자로 정렬됨).
500506 genome 71445 71461 0
500506 genome 308369 308384 0
500506 genome 335450 335533 0
500506 genome 425268 425293 0
500506 genome 623326 623715 0
502289 genome 308370 308384 0
502289 genome 335462 335689 0
502289 genome 425268 425290 0
범위, 파일에서 해당 범위를 본 횟수, 해당 범위를 가진 줄 식별자를 보여주는 목록을 얻고 싶습니다.
71445-71461 1 500506
308369-308369 1 500506
308370-308384 2 500506,502289
335450-335461 1 500506
335462-335533 2 500506,502289
335534-335689 2 500506,502289
425268-425290 2 500506,502289
425291-425293 1 500506
위의 예에서 502289는 500506과 정확히 동일한 범위와 일치할 수도 있고, 해당 범위 내의 어딘가에 속할 수도 있고, 그 반대일 수도 있습니다. 간단한 스크립트로 이 작업을 수행할 수 있습니까? 아니면 Perl 스크립트 같은 것을 사용해야 합니까?
답변1
이 명령문이 올바르게 실행되는지 확인하려면 더 많은 양의 데이터(4행 이상)에서 다음 스크립트를 테스트해야 합니다.if ((A[1]<$3 && $4<=A[2])||(A[1]<=$3 && $4<A[2]))
awk '
BEGIN{SUBSEP="-"}
{ if (($3, $4) in ids)
ids[$3,$4]=ids[$3,$4] "," $1
else
ids[$3,$4]=$1
}
END{ for (rng1 in ids) {
split (rng1,A,SUBSEP)
for (rng2 in ids) {
split (rng2,B,SUBSEP)
if ((A[1]<B[1] && B[2]<=A[2])||(A[1]<=B[1] && B[2]<A[2]))
ids[rng2]=ids[rng2] "," ids[rng1]
}
}
for (rng in ids) {
for (i=1;i<=split(ids[rng],D,",");i++)
a[D[i]]=1
s=k=""
n=0
for (j in a) {
k=k s j
s=","
n++
}
print rng, n, k
delete a
}
}' formatted.file