Puncte:0

Cum se verifică dacă un interval de numere dintr-un fișier este subsetul altui interval de numere din alt fișier?

drapel ua

Î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.

Arnaud Valmary avatar
drapel my
Buna ziua. Primul punct, în al doilea bloc `{...}` (fără condiție) avem o instrucțiune `next` la sfârșit. Deci al treilea bloc (cu bucle) nu este niciodată executat.
Arnaud Valmary avatar
drapel my
Ai un rezultat bun?
vibhu sharma avatar
drapel ua
da am primit resu;t
vibhu sharma avatar
drapel ua
https://stackoverflow.com/questions/69104341/how-to-check-whether-one-number-range-from-one-file-is-the-subset-of-other-numbe/69105292#69105292
αғsнιη avatar
drapel cn
Votez pentru a închide această întrebare deoarece am postat încrucișat https://stackoverflow.com/q/69104341/4023950

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.