확립된:File_A와 겹치는 File_B에서 이름을 추출합니다.
file_b의 두 번째 열이 4열과 file_b5 사이에 있는 경우 file_b의 첫 번째 열을 file_a(보통 "Name=" 뒤의 열 10)와 일치시켜 유전자 이름을 추출하고 싶습니다. 한 열이 일치해야 하므로 행(file_b)당 하나의 유전자만 얻습니다. 그러나 이론상으로는 동일한 유전자와 일치하는 여러 개의 인접한 행(column_b)을 가질 수 있습니다(예: file_b의 두 번째 행이 MT 4065
).
현재 코드에 몇 가지 문제가 있습니다.
(1) 아래 설정 방법으로 file_b의 마지막 줄이 출력에서 누락되지만 groupVII 17978350
해당 줄( )이 목록에 나타나면 상황이 달라집니다. 설정된 대로 작동하길 원합니다.
(2) 이름에 특수 문자(콜론, 하이픈 등)가 포함된 경우 이름이 잘립니다. 등호 뒤에 전체 이름을 추가하고 싶습니다.
(3) 처음 두 열이 항목이고 세 번째 열이 유전자 적중이 되도록 file_b의 항목/행을 출력의 유전자 적중과 일치시키고 싶습니다.
file_a.tsv
MT insdc gene 2851 3825 . + . ID=gene:ENSGACG00000020925 Name=mt-nd1 biotype=protein_coding description=NADH dehydrogenase 1%2C mitochondrial [Source:ZFIN%3BAcc:ZDB-GENE-011205-7] gene_id=ENSGACG00000020925 logic_name=mt_genbank_import version=1
MT insdc gene 4036 5082 . + . ID=gene:ENSGACG00000020929 Name=mt-nd2 biotype=protein_coding description=NADH dehydrogenase 2%2C mitochondrial [Source:ZFIN%3BAcc:ZDB-GENE-011205-8] gene_id=ENSGACG00000020929 logic_name=mt_genbank_import version=1
groupIII ensembl gene 7332324 7334769 . - . ID=gene:ENSGACG00000015265 Name=si:dkeyp-68b7.10 biotype=protein_coding description=si:dkeyp-68b7.10 [Source:ZFIN%3BAcc:ZDB-GENE-070912-667] gene_id=ENSGACG00000015265 logic_name=ensembl version=1
groupIV ensembl gene 1368026 1374881 . + . ID=gene:ENSGACG00000016447 Name=hnrnpa0b biotype=protein_coding description=heterogeneous nuclear ribonucleoprotein A0b [Source:ZFIN%3BAcc:ZDB-GENE-030131-6154] gene_id=ENSGACG00000016447 logic_name=ensembl version=1
groupIV ensembl gene 5347339 5349041 . - . ID=gene:ENSGACG00000017010 Name=zgc:153018 biotype=protein_coding description=zgc:153018 [Source:ZFIN%3BAcc:ZDB-GENE-060929-752] gene_id=ENSGACG00000017010 logic_name=ensembl version=1
groupV ensembl gene 120615 125489 . + . ID=gene:ENSGACG00000002103 Name=zdhhc6 biotype=protein_coding description=zinc finger%2C DHHC-type containing 6 [Source:ZFIN%3BAcc:ZDB-GENE-030131-3189] gene_id=ENSGACG00000002103 logic_name=ensembl version=1
groupVI ensembl gene 11230354 11232784 . + . ID=gene:ENSGACG00000009527 Name=bnip4 biotype=protein_coding description=BCL2 interacting protein 4 [Source:ZFIN%3BAcc:ZDB-GENE-051113-212] gene_id=ENSGACG00000009527 logic_name=ensembl version=1
groupVII ensembl gene 2271611 2277214 . + . ID=gene:ENSGACG00000019012 Name=sf3b2 biotype=protein_coding description=splicing factor 3b%2C subunit 2 [Source:ZFIN%3BAcc:ZDB-GENE-070928-1] gene_id=ENSGACG00000019012 logic_name=ensembl version=2
groupVII ensembl gene 15815857 15824549 . + . ID=gene:ENSGACG00000020296 Name=mpp1 biotype=protein_coding description=membrane protein%2C palmitoylated 1 [Source:ZFIN%3BAcc:ZDB-GENE-031113-4] gene_id=ENSGACG00000020296 logic_name=ensembl version=1
groupVII ensembl gene 17978322 17982388 . + . ID=gene:ENSGACG00000020399 Name=si:ch211-284e13.4 biotype=protein_coding description=si:ch211-284e13.4 [Source:ZFIN%3BAcc:ZDB-GENE-060526-161] gene_id=ENSGACG00000020399 logic_name=ensembl version=1
파일_b.tsv
MT 4050
groupIII 7332350
groupIV 5347350
groupVI 11230375
groupVII 17978350
암호:
while read -r id pos; do awk -v id="$id" -v pos="$pos" '$1 == id && pos > $4 && pos < $5 { if (gensub(/.*Name=([A-Za-z0-9]*).*/, "\\1", 1) !~ /\s/) print gensub(/.*Name=([A-Za-z0-9]*).*/, "\\1", 1); }' <file_a.tsv; done < file_b.tsv > output.tsv
출력.tsv
mt
si
zgc
bnip4
예상 출력
MT 4050 mt-nd2
groupIII 7332350 si:dkeyp-68b7.10
groupIV 5347350 zgc:153018
groupVI 11230375 bnip4
groupVII 17978350 si:ch211-284e13.4
답변1
# save this as script.awk or whatevernameyouwant.awk
function within_range(val, lower, upper, proximity) {
# you can specify the "proximity" as required
return val > lower - proximity && val < upper + proximity
}
BEGIN {
OFS="\t"
}
$1 == id && within_range(pos, $4, $5, 100) {
name = gensub(/.*Name=([^\t]*).*/, "\\1", 1)
if (name ~ /[^[:space:]]+/)
print id, pos, name
}
그런 다음 실행
while read -r id pos
do
awk -v id=$id -v pos=$pos -f script.awk file_a.tsv
done < file_b.tsv > output.tsv
제발.tsv
파일을 처리하기 전에 파일의 필드를 탭으로 구분 해야 합니다 . 내 결과:
MT 4050 mt-nd2
groupIII 7332350 si:dkeyp-68b7.10
groupIV 5347350 zgc:153018
groupVI 11230375 bnip4
groupVII 17978350 si:ch211-284e13.4
ID의 경우 유전자 적중이 불가능 MT
해야 합니다 .mt-nd2
mt-nd1
데이터 처리에는 여전히 Python을 사용하는 것이 좋습니다.
답변2
예상되는 디스플레이 출력이 제 생각에는 일치하지 않는 것 같습니다(2줄 -> 1줄과 3줄). 이것이 오타라면 다음을 시도해 볼 수 있습니까?
awk 'FNR==NR{a[$1]=$2;next} ($1 in a) && (a[$1]>=$4 && a[$1]<=$5){sub("Name=","",$10);print $1,a[$1],$10}' b.tsv a.tsv > output.tsv