이 작업을 수행할 수 있는 방법이 있을 것이라고 확신하지만 막혀서 도움을 드리고 싶습니다. 아래와 같이 두 개의 파일이 있습니다.
파일 1:
8750 11.29592283
8800 7.500359335
14150 3.281781819
23850 3.668931975
23900 14.69918465
23950 5.259260427
27300 3.374571119
파일 2:
hypothetical protein CDS 7152 7346 TK0006
hypothetical protein CDS 7399 7614 TK0007
DNA methylase CDS 7655 8755 TK0008
hypothetical protein CDS 8760 10093 TK0009
hypothetical protein CDS 10095 10379 TK0010
hypothetical protein CDS 10385 10807 TK0011
File1은 게놈 좌표 및 발현 값이고 File2는 게놈 주석입니다. 내가 필요한 것은 컬럼 1 파일 1의 값이 컬럼 2 파일 2와 컬럼 3 파일 3 사이에 있는 경우 각 파일의 전체 행을 반환하는 것입니다. 예를 들어, file1의 처음 두 줄은 다음 출력을 반환합니다.
8750 11.29592283 DNA methylase CDS 7655 8755 TK0008
8800 7.500359335 hypothetical protein CDS 8760 10093 TK0009
짧은 awk 명령이나 이와 유사한 명령을 사용하여 이러한 프로세스가 가능합니까? 아니면 내가 씹을 수 있는 것보다 더 많이 깨물고 있는 걸까?
감사해요! !
답변1
앗해결책:
awk -F'[[:space:]][[:space:]]+' 'NR==FNR{ a[$1]=$0; next }
{ for(i in a) {
if (int(i) >= $2 && int(i) <= $3) {
print a[i],$0; delete a[i]; break
}
}
}' File1 OFS='\t' File2
산출:
8750 11.29592283 DNA methylase CDS 7655 8755 TK0008
8800 7.500359335 hypothetical protein CDS 8760 10093 TK0009
-F'[[:space:]][[:space:]]+'
- 필드 구분자를 정의하는 패턴a[$1]=$0
- 그것으로부터 핵심 가치를 얻는다File1
if (int(i) >= $2 && int(i) <= $3)
- 첫 번째 필드 값이File1
범위(두 번째와 세 번째 필드 값 사이File2
) 내에 있는지 확인하세요.delete a[i]
- 일치하는 값 삭제break
- 중복 반복을 피하기 위해 루프 중단