[linux] Deel van een tekst bestand sorteren.

Paul Slootman paul+nospam op wurtel.net
Do Feb 15 09:57:04 CET 2024


On Wed 14 Feb 2024, Geert Stappers via Linux wrote:

> > De laatste file moet je nog handmatig wegschrijven.
> > Om het helemaal automatisch te doen:
> > 
> > vim -c 'argdo g/^-/,/^[^-]/-1!sort' -c wq *
> > 

> Ja, die doet het.  Dank je wel.
> 
> 
> Ja, die doet het voor het voorbeeld.  Nog steeds bedankt.
> 
> 
> Van de vim man page begrijp ik dat de 'argdo'  "argument do" is.
> (Er blijkt ook 'bufdo'  "buffer do" te zijn.)
> 
> 
> Groeten
> Geert Stappers
> 
> Worstelt met
> 
> Kop
>   MARKER Romeo
>   MARKER Charlie
>   MARKER Mike
> Staart

vim -c 'argdo g/^  MARKER/,/^[^ ][^ ][^M]/-1!sort' -c wq *

Het wordt lastiger als er meerdere lijstjes in 1 file staan.
Dan zou ik weer snel teruggrijpen naar perl...


-----------------------------
#!/usr/bin/perl

$MARKER = '  MARKER';
@CONTENT = ();
@LIJST = ();

sub sortit {
    if ($#LIJST >= 0) {
	push @CONTENT, sort @LIJST;
	@LIJST = ();
    }
}

foreach $fn (@ARGV) {
    open(IN, $fn) or die "Can't open file '$fn': $!\n";
    while (<IN>) {
	if (/^$MARKER/) {
	    push @LIJST, $_;
	}
	else {
	    sortit;
	    push @CONTENT, $_;
	}
    }
} continue {
    sortit;
    close IN;
    open(OUT, ">$fn") or die "Can't open file '$fn' for output: $!\n";
    print OUT @CONTENT;
    close OUT;
    @CONTENT = ();
    @LIJST = ();
}
-----------------------------

@ARGV is de lijst van parameters (arguments)
foreach loopt daarover
De continue block wordt uitgevoerd voordat de foreach opnieuw
geevalueerd wordt
Bij elke regel wordt gekeken of die begint met de marker.
Zo ja: sla de regel op in een aparte array LIJST
Zo niet: sorteer de LIJST als die niet leeg is en voeg die toe aan de
CONTENT array.
Doe die laatste stap ook aan het eind via de continue block voor het
geval de file eindigt met een lijst.
Overschrijf vervolgens de file met de nieuwe content.


Paul


Meer informatie over de Linux maillijst