Toon posts:

Vi, in combi met megagrote tekstfile

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hoi,

Ik weet eigenlijk niet zo veel van vi, maar wil het volgende graag bereiken.

Ik heb een textfile van 500.000+ regels van 9,1MB

Wat ik dus wil doen is 1 regel per 100 overhouden.

Dus 1 regel naar beneden -> 99 regels weghalen -> 1 regel naar beneden -> 99 regels weghalen -> etc.

Kan iemand me opweg helpen of en hoe dit gedaan kan worden?

Alvast bedankt.

Verwijderd

Dat kan je beter vanuit BASH doen, daar zijn genoeg textfile edit commando's voor. Denk niet dat VI je hierbij goed kan helpen...

[ Voor 71% gewijzigd door Verwijderd op 15-07-2005 15:19 ]


  • frim
  • Registratie: Augustus 2001
  • Niet online
Ik zou (GNU) sed gebruiken, bijvoorbeeld met
sed -n '1~100p'

[ Voor 30% gewijzigd door frim op 15-07-2005 15:34 ]


  • grep
  • Registratie: Augustus 2001
  • Laatst online: 30-01 13:52

grep

meer begrep...

in command mode op de 1e regel gaan staan die je wilt verwijderen en dan typ je:

d98

Je verwijderd dan de regel waar je op staat + de 98 daarna.

Om dit met overslaan van een regel meerdere keren achter elkaar te doen zal je met macros aan de slag moeten denk ik, maar daar heb ik niet veel ervaring mee.

  • Wilke
  • Registratie: December 2000
  • Laatst online: 22:54
wat grep zegt klopt helaas niet helemaal, al is het idee goed. Je moet typen '99dd'. 'dd' haalt namelijk een regel weg, en in vi kun je elk commando herhalen door er gewoon een getal voor te tikken.

Met '.' kun je bovendien het laatste commando herhalen, maar helaas kan navigatie daar niet onder vallen. Je kunt dus wel een keer intikken '99dd', en dan afwisselen tussen '.' en 'pijltje-naar-beneden', maar dat is bij 500k regels nog steeds geen feest natuurlijk ;)

Dus zoals al opgemerkt: vi is hiervoor de verkeerde tool, gebruik iets als sed ofzo (wat frim zegt)

  • chris
  • Registratie: September 2001
  • Laatst online: 11-03-2022
In vim is het niet zo moeilijk:
code:
1
vim filenaam.txt

(ga naar de eerste regel van de file)
code:
1
2
3
4
qa <ENTER>
j <ENTER>
99dd <ENTER>
q <ENTER>

Nu kan je het volgende doen:
code:
1
@a <ENTER>

En er worden weer 99 regels verwijderd. Wat dan helemaal mooi is:
code:
1
1000@a

En dit gebeurt duizend keer :)
Maar eigenlijk is het makkelijker met sed / perl / ruby.

[ Voor 9% gewijzigd door chris op 15-07-2005 17:06 ]


  • CyberSnooP
  • Registratie: Augustus 2000
  • Laatst online: 06-11-2025

CyberSnooP

^^^^ schrijft --->

chris schreef op vrijdag 15 juli 2005 @ 17:06:
qa <ENTER>
j <ENTER>
99dd <ENTER>
q <ENTER>
[/code]
Kleinigheid, 99 keer één regel verwijderen is iets onhandiger dan in een keer 99 regels verwijderen, je zou 99dd dus kunnen veranderen d99j.

|_____vakje______|


  • pinball
  • Registratie: Oktober 1999
  • Niet online

pinball

Electric Monk

Hoewel sed al lang de hoofdprijs heeft binnengesleept mag de perl oplossing natuurlijk niet ontbreken :P
code:
1
perl -ne 'print if ($i==0); $i==99 ? $i=0 : $i++ ;' bestand.txt

Whenever you find that you are on the side of the majority, it is time to reform.


  • phreggle
  • Registratie: Juni 2002
  • Niet online
pinball schreef op zaterdag 16 juli 2005 @ 09:49:
Hoewel sed al lang de hoofdprijs heeft binnengesleept mag de perl oplossing natuurlijk niet ontbreken :P
code:
1
perl -ne 'print if ($i==0); $i==99 ? $i=0 : $i++ ;' bestand.txt
Dat kan natuurlijk nog wel korter :p
code:
1
perl -ne 'print if($i++%99==0);' bestand.txt


Geen schoonheidsprijs natuurlijk, maar dat geeft niet. :)

Edit:

Nieuwe versie: :P
code:
1
perl -ne 'print if($i++%100==0);' bestand.txt

[ Voor 23% gewijzigd door phreggle op 16-07-2005 10:45 ]


  • pinball
  • Registratie: Oktober 1999
  • Niet online

pinball

Electric Monk

phreggle schreef op zaterdag 16 juli 2005 @ 10:27:
Geen schoonheidsprijs natuurlijk, maar dat geeft niet. :)
als je van die 99 100 maakt vind ik het wel een prijs waard :)

Whenever you find that you are on the side of the majority, it is time to reform.


  • phreggle
  • Registratie: Juni 2002
  • Niet online
pinball schreef op zaterdag 16 juli 2005 @ 10:33:
[...]


als je van die 99 100 maakt vind ik het wel een prijs waard :)
Oeps.. en ik had het nog wel 'getest' (ja dat zag er wel aardig genoeg uit).
Het is nog vroeg. :)

  • grep
  • Registratie: Augustus 2001
  • Laatst online: 30-01 13:52

grep

meer begrep...

Wilke schreef op vrijdag 15 juli 2005 @ 15:46:
wat grep zegt klopt helaas niet helemaal, al is het idee goed. Je moet typen '99dd'. 'dd' haalt namelijk een regel weg, en in vi kun je elk commando herhalen door er gewoon een getal voor te tikken.
Als je het zelf geprobeerd zou hebben had je gezien dat beide methodes werken.

  • Wilke
  • Registratie: December 2000
  • Laatst online: 22:54
grep schreef op zaterdag 16 juli 2005 @ 13:59:
Als je het zelf geprobeerd zou hebben had je gezien dat beide methodes werken.
* Wilke start vi

* Wilke typt wat zooi

* Wilke typt 'd99'

* Wilke constateert dat er helemaal niets gebeurt

Misschien een compleet andere versie van vi dan, bij mij is dat in ieder geval zeker niet hetzelfde, naar het schijnt :)

  • grep
  • Registratie: Augustus 2001
  • Laatst online: 30-01 13:52

grep

meer begrep...

weird.
Ik heb het onder hp-ux en debian linux geprobeerd en beide werken.

'd' is in vi namelijk het delete commando, waarachter je kan aangeven wat er precies gedelete kan worden. Dat kan een line zijn (=d, dus dan krijg je dd), of d$ = delete tot het einde van de line of d3w = delete 3 words.

  • blaataaps
  • Registratie: Juli 2001
  • Niet online
En volgens die redenatie wacht ie bij "d99" toch op een specificatie van /wat/ ie 99 keer moet deleten en gebeurt er eerst niks lijkt me.

[ Voor 5% gewijzigd door blaataaps op 17-07-2005 12:25 ]


  • serkoon
  • Registratie: April 2000
  • Niet online

serkoon

mekker.

'd99d' dus..

Vim snapt dat overigens weer niet (en op sommige platformen hebben de developers besloten tot enge symlinks van vi naar vim, zodat je een heel ander programma gebruikt dan eigenlijk de bedoeling was.. *zucht*)

Edit: vim snapt het dus wel :P

[ Voor 10% gewijzigd door serkoon op 17-07-2005 12:47 ]


  • blaataaps
  • Registratie: Juli 2001
  • Niet online
vim doet het hier prima met d10d ? "10 fewer lines" of bedoel je wat anders? :)

  • serkoon
  • Registratie: April 2000
  • Niet online

serkoon

mekker.

blaataaps schreef op zondag 17 juli 2005 @ 12:43:
vim doet het hier prima met d10d ? "10 fewer lines" of bedoel je wat anders? :)
Klopt, ik zat in de verkeerde mode :P

  • guardian-spirit
  • Registratie: Februari 2004
  • Laatst online: 30-03-2023
edit

- stom van mij, helaas werken de genoemde programma's niet in non-windows os... dit is non windows...sorry -

[ Voor 76% gewijzigd door guardian-spirit op 17-07-2005 13:41 ]


  • htca
  • Registratie: November 2001
  • Laatst online: 09-02 21:49
Je kunt toch de macro functie gebruiken van vi:
code:
1
:map ; j99ddj

Kort gezegd
j - naar de volgende regel
99dd - 99 regels weggooien
j - naar de volgende regel
dan vervolgens op ; blijven drukken totdat je aan het einde van je file bent.

  • pinball
  • Registratie: Oktober 1999
  • Niet online

pinball

Electric Monk

Verwijderd schreef op vrijdag 15 juli 2005 @ 15:16:<..>
Ik heb een textfile van 500.000+ regels
<..>
htca schreef op zondag 17 juli 2005 @ 19:39:<..>
dan vervolgens op ; blijven drukken totdat je aan het einde van je file bent.
<..>
is dan 5000; geen betere optie? Of kunnen macro's zo niet herhaald worden?

Whenever you find that you are on the side of the majority, it is time to reform.


  • VyperX
  • Registratie: Juni 2001
  • Laatst online: 09-02 09:12
Waarom wil je eigenlijk telkens die 99 regels weg hebben? Als dat is omdat er telkens op de eerste regel van een blok van 100 iets staat wat je wilt hebben, dan zou je ook kunnen kijken of er een patroon is voor die eerste regels. Dan zou je het programma `grep' kunnen gebruiken.

(De andere oplossingen (zoals `sed' en `vi(m)') zijn waarschijnlijk wel sneller, omdat die de overige 99 regels niet hoeven te controleren. :)

My Dwarf Fortress ASCII Reward: ~~@~~####,.".D",.B""

Pagina: 1