Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

Samenvoegen kolommen uit twee files na complexe vergelijking

Pagina: 1
Acties:

  • -Elmer-
  • Registratie: Augustus 2002
  • Laatst online: 27-09 22:58
Voor mijn studie ben ik bezig met een genoom-project en heb een tweetal bestanden die ik graag samen wil voegen.

Feitelijk gaat het om het volgende
code:
1
2
3
4
5
6
7
8
9
VOOR iedere regel in bestand_1
ALS [nummer in kolom 2 in bestand 1]
     GELIJK IS AAN [nummer kolom 4 in [i][u]een regel[/u][/i] in bestand 2] 
     OF GELIJK IS AAN [nummer kolom 5 in [i][u]een regel[/u][/i] in bestand 2] 
     OF valt tussen [nummer in kolom van 4 en kolom 5 in een regel van bestand_2]
DAN 
     voeg kolom 3, 7 en 9 uit [i][u]een regel[/u][/i] uit bestand_1 toe aan kolom 3, 4 en 5 in bestand_1

En dat voor alle +/- 1 miljoen regels.


Iemand een idee hoe ik dat in AWK of SED kan oplossen? Perl is natuurlijk ook prima.

Hierbij een aantal voorbeeld bestanden om mee te spelen - maakt het denk ik makkelijker:

Bestand_1
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
SOME_NON_RELEVANT_STRING    142
SOME_NON_RELEVANT_STRING    182
SOME_NON_RELEVANT_STRING    320
SOME_NON_RELEVANT_STRING    321
SOME_NON_RELEVANT_STRING    322
SOME_NON_RELEVANT_STRING    471
SOME_NON_RELEVANT_STRING    488
SOME_NON_RELEVANT_STRING    497
SOME_NON_RELEVANT_STRING    541
SOME_NON_RELEVANT_STRING    545
SOME_NON_RELEVANT_STRING    548
SOME_NON_RELEVANT_STRING    4105
SOME_NON_RELEVANT_STRING    15879
SOME_NON_RELEVANT_STRING    26534
SOME_NON_RELEVANT_STRING    30000
SOME_NON_RELEVANT_STRING    30001
SOME_NON_RELEVANT_STRING    40001
SOME_NON_RELEVANT_STRING    44752
SOME_NON_RELEVANT_STRING    50587
SOME_NON_RELEVANT_STRING    87512
SOME_NON_RELEVANT_STRING    96541
SOME_NON_RELEVANT_STRING    99541
SOME_NON_RELEVANT_STRING    99871


Bestand_2
code:
1
2
3
4
5
6
7
8
9
10
11
SOME_NON_RELEVANT_STRING    SOME_NON_RELEVANT_STRING    A1  0   38  B1  C1
SOME_NON_RELEVANT_STRING    SOME_NON_RELEVANT_STRING    A2  40  2100    B2  C2
SOME_NON_RELEVANT_STRING    SOME_NON_RELEVANT_STRING    A3  2101    9999    B3  C3
SOME_NON_RELEVANT_STRING    SOME_NON_RELEVANT_STRING    A4  10000   15000   B4  C4
SOME_NON_RELEVANT_STRING    SOME_NON_RELEVANT_STRING    A5  15001   30000   B5  C5
SOME_NON_RELEVANT_STRING    SOME_NON_RELEVANT_STRING    A6  30001   40000   B6  C6
SOME_NON_RELEVANT_STRING    SOME_NON_RELEVANT_STRING    A7  40001   50001   B7  C7
SOME_NON_RELEVANT_STRING    SOME_NON_RELEVANT_STRING    A8  50001   50587   B8  C8
SOME_NON_RELEVANT_STRING    SOME_NON_RELEVANT_STRING    A9  50588   83054   B9  C9
SOME_NON_RELEVANT_STRING    SOME_NON_RELEVANT_STRING    A10 83055   98421   B10 C10
SOME_NON_RELEVANT_STRING    SOME_NON_RELEVANT_STRING    A11 98422   99999   B11 C11


Gewenste output:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
142 A2  B2  C2
182 A2  B2  C2
320 A2  B2  C2
321 A2  B2  C2
322 A2  B2  C2
471 A2  B2  C2
488 A2  B2  C2
497 A2  B2  C2
541 A2  B2  C2
545 A2  B2  C2
548 A2  B2  C2
4105    A3  B3  C3
15879   A5  B5  C5
26534   A5  B5  C5
30000   A5  B5  C5
30001   A6  B6  C6
40001   A7  B7  C7
44752   A7  B7  C7
50587   A8  B8  C8
87512   A10 B10 C10
96541   A10 B10 C10
99541   A11 B11 C11
99871   A11 B11 C11

[ Voor 68% gewijzigd door -Elmer- op 13-05-2013 16:30 ]


Verwijderd

Natuurlijk is een code-request niet toegestaan en daar ga ik je ook niet mee helpen ...

Wel kan ik je wat pointers geven:

- hou het simpel ... splits de taken in kleine stukjes/functies op die makkelijk te debuggen en te herbruiken zijn
- hou je geheugengebruik laag : laadt alleen de waarden in die belangrijk zijn en sla hiervan het regelnummer / index op om later te gebruiken.


verder moet het niet te moeilijk zijn om dit voor elkaar te krijgen wat voor taal dan ook

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Hier hoef je niet eens voor te scripten, dit ook prima met zeg Access / OpenOffice Base, dan kun je met een enkele query een 'join' maken tussen die 2 tabelletjes als je de bestanden importeert :p
1 miljoen is natuurlijk niks, dat past makkelijk in het geheugen op een moderne machine. ;)

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


  • Boogie
  • Registratie: Januari 2001
  • Laatst online: 09-11 23:00
Zou je niet eenvoudigweg de bestanden inlezen in een database?

Select tabel1.kolom2, tabel2.kolom3, tabel2.kolom4, tabel2.kolom5
into resultaattabel
from tabel1
left outer join tabel2 on tabel1.kolom2 = tabel2.kolom4 or tabel1.kolom2 = tabel2.kolom5
or (tabel1.kolom2 > tabel2.kolom4 and tabel2.kolom1 < tabel2.kolom5)
there tabel2.kolom4 is not null

het alternatief is inderdaad dat je in een programmeertaal naar keuze
-bestand2 in een array leest
-bestand1 doorloopt
-in de array2 elke entry aftest of deze een match is
- regel in resultaatbestand schrijven met nu bekende waarden

succes!

Verwijderd

pedorus schreef op dinsdag 14 mei 2013 @ 00:04:
1 miljoen is natuurlijk niks, dat past makkelijk in het geheugen op een moderne machine. ;)
Tuurlijk ... past makkelijk ... maar toch lijkt me het niet onverstandig om aan te leren om zuinig met je resources om te gaan.

Dit gaat om een opdrachtje van niets natuurlijk maar in real-life oplossingen waar er soms meerdere instances van applicaties op dezelfde machine toch moeten performen met hele grote datasets is het soms cruciaal.

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 22:23

Creepy

Tactical Espionage Splatterer

Elmer: wat had je zelf al geprobeerd en wat lukte daar niet mee? In PRG draait het om zelf programmeren, niet om anderen dat voor je te laten doen, en daar komt het nu wel een beetje op neer op deze manier.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • BtM909
  • Registratie: Juni 2000
  • Niet online

BtM909

Watch out Guys...

^ ^ hehe

Het is niet de bedoeling dat je hier maar je probleem dumpt en wat testbestanden erbij post en dan maar gaat wachten totdat iemand een oplossing biedt.

Zie ook: Devschuur® Beleid#scriptrequest. Het is dus de bedoeling dat je zelf laat zien wat je hebt geprogrammeerd (hence de titel van dit subforum ;)) en waar je precies tegenaan loopt. Ik hoop dat je je topicstart aanpast en toevoegt wat je zelf hebt geprobeerd, waar je op hebt gezocht, waarom de gevonden oplossingen niet jouw oplossing kan zijn.

Ace of Base vs Charli XCX - All That She Boom Claps (RMT) | Clean Bandit vs Galantis - I'd Rather Be You (RMT)
You've moved up on my notch-list. You have 1 notch
I have a black belt in Kung Flu.


  • sam.vimes
  • Registratie: Januari 2007
  • Laatst online: 08-06 08:44
-Elmer- schreef op maandag 13 mei 2013 @ 15:55:
Voor mijn studie ben ik bezig met een genoom-project en heb een tweetal bestanden die ik graag samen wil voegen.

Feitelijk gaat het om het volgende
code:
1
2
3
4
5
6
7
8
9
VOOR iedere regel in bestand_1
ALS [nummer in kolom 2 in bestand 1]
     GELIJK IS AAN [nummer kolom 4 in [i][u]een regel[/u][/i] in bestand 2] 
     OF GELIJK IS AAN [nummer kolom 5 in [i][u]een regel[/u][/i] in bestand 2] 
     OF valt tussen [nummer in kolom van 4 en kolom 5 in een regel van bestand_2]
DAN 
     voeg kolom 3, 7 en 9 uit [i][u]een regel[/u][/i] uit bestand_1 toe aan kolom 3, 4 en 5 in bestand_1

En dat voor alle +/- 1 miljoen regels.
Ik zie hier 1 lus die door bestand 1 heen loopt, maar hoe zit het met bestand 2? Bestaat dat ook uit 1 miljoen regels? Mogen regels uit bestand 2 meerdere keren worden gebruikt voor de vergelijking(en)? Is bestand 2 gestorteerd op oplopende kolom 4 en/of 5?
Ofwel: moeten we 1miljoen + 1miljoen vergelijkingen uitvoeren of 1miljoen * 1miljoen? 8)7

Als je je algoritme nauwkeurig genoeg beschrijft, kun je het zonder veel problemen in een programma uitwerken.

Op zich ziet het probleem er eenvoudig uit. Gebruik wel een "echte" programmeertaal zoals Perl of Python; met sed (en in mindere mate awk) haal je je door de beperkingen van de taal een hoop extra werk op de hals.
Pagina: 1