Încerc să aflu dacă numerele intervalului1 [ambele coloane a și b] sunt subsetul sau se află între coloanele intervalului2 [ambele coloane b și c].
interval 1
a b
15 20
8 10
37 44
32 37
intervalul 2
a b c
chr1 6 12
chr2 13 21
chr3 31 35
chr4 36 45
ieșire:
a b c
chr1 6 12 8 10
chr2 13 21 15 20
chr4 36 45 37 44
Am încercat să învăț din acest cod [care funcționează dacă dorim să verificăm dacă un singur număr se află într-un anumit interval], prin urmare am încercat să modific același lucru pentru două ambele numere. Dar nu a funcționat, simt că nu pot citi corect al doilea fișier.
Am vrut să compar intervalul1[a] cu intervalul2[b] și intervalul1[b] cu intervalul2[c]. Comparație una la toate.
De exemplu, în prima rulare: primul rând din intervalul-1 cu toate celelalte rânduri din intervalul-2.Dar intervalul1[a] ar trebui comparat numai cu intervalul2[b] și, în mod similar, intervalul1[b] ar trebui comparat numai cu intervalul2[c]. Doar pe baza asta am scris un criteriu:
lbs[i] && lbsf1[j] <= ubs[i] && ubsf1[j] >= lbs[i] && ubsf1[j] <= ubs[i]
r1[a] r2[b] r1[b] r2[c]
15 > 6 20 < 12 Fals
15 > 13 20 < 21 Adevărat
15 > 31 20 < 35 Fals
15 > 36 20 < 45 Fals
Cod: [referinţă dar puțin modificat]
#!/bin/bash
awk -F'\t' '
# Prima trecere (fișier B): citiți limitele inferioare și superioare ale intervalului
FNR==NR { lbs[++count] = $2+0; ubs[număr] = $3+0; Următorul }
# A doua trecere (fișierA): verificați fiecare linie în raport cu toate intervalele.
{ lbsf1[++countf1] = $1+0; ubsf1[countf1] = $2+0; Următorul }
{
for(i=1;i<=count;++i)
{
pentru(j=1;j<=countf1;++j)
dacă (lbsf1[j] >= lbs[i] && lbsf1[j] <= ubs[i] && ubsf1[j] >= lbs[i] && ubsf1[j] <= ubs[i])
{ print lbs[i]"\t"ubs[i]"\t"lbsf1[j]"\t"ubsf1[j] ; Următorul }
}
}
' interval2 interval1
Mulțumesc.