Er zijn een aantal manieren om tekstbestanden onder Linux samen te voegen en te sorteren, maar hoe u dat doet hangt af van wat u wilt bereiken – of u gewoon de inhoud van meerdere bestanden in één groot bestand wilt zetten, of het op een bepaalde manier wilt organiseren zodat het gemakkelijker te gebruiken is. In dit artikel bekijken we een aantal commando’s voor het sorteren en samenvoegen van bestandsinhoud en bekijken we hoe de resultaten verschillen.
Gebruik cat
Als u alleen maar een groep bestanden wilt samenvoegen tot een enkel bestand, is het cat commando een gemakkelijke keuze. Het enige wat u hoeft te doen is “cat” te typen en vervolgens de bestanden op de opdrachtregel op te sommen in de volgorde waarin u ze in het samengevoegde bestand wilt opnemen. Leid de uitvoer van het commando naar het bestand dat u wilt maken. Als een bestand met de opgegeven naam al bestaat, wordt het overschreven door het bestand dat u aanmaakt. Bijvoorbeeld:
$ cat firstfile secondfile thirdfile > newfile
Wilt u de inhoud van een serie bestanden toevoegen aan een bestaand bestand in plaats van het te overschrijven, verander dan de > in >>.
$ cat firstfile secondfile thirdfile >> updated_file
Als de bestanden die u samenvoegt een handige naamgevingsconventie volgen, kan de taak nog eenvoudiger zijn. U hoeft dan niet alle bestandsnamen op te nemen als u ze kunt specificeren met een reguliere expressie. Als de bestanden bijvoorbeeld allemaal eindigen op het woord “bestand” zoals in het voorbeeld hierboven, dan kunt u iets als dit doen:
$ cat *file > allfiles
Merk op dat het commando hierboven de inhoud van de bestanden in alfanumerieke volgorde toevoegt. Onder Linux zou een bestand met de naam “filea” worden toegevoegd vóór een bestand met de naam “fileA”, maar na een bestand met de naam “file7”. Tenslotte moeten we niet alleen denken aan “ABCDE” als we te maken hebben met een alfanumerieke reeks; we moeten ook denken aan “0123456789aAbBcCdDeE”. Je kunt altijd een commando als “ls *file” gebruiken om de volgorde te zien waarin de bestanden zullen worden toegevoegd voordat je de bestanden samenvoegt.
NOOT: Het is een goed idee om er eerst zeker van te zijn dat je commando alle bestanden bevat die je in het samengevoegde bestand wilt hebben en geen andere – vooral als je een wild card als “*” gebruikt. En vergeet niet dat de samengevoegde bestanden nog steeds als afzonderlijke bestanden zullen bestaan, die u misschien wilt verwijderen zodra de samenvoeging is geverifieerd.
Bestanden samenvoegen op leeftijd
Als u uw bestanden wilt samenvoegen op basis van de leeftijd van elk bestand in plaats van op bestandsnaam, gebruikt u een commando als dit:
$ for file in `ls -tr myfile.*`; do cat $file >> BigFile.$$; done
Het gebruik van de -tr opties (t=tijd, r=omgekeerd) zal resulteren in een lijst van bestanden in de oudste-eerste leeftijdsvolgorde. Dit kan bijvoorbeeld handig zijn als u een logboek bijhoudt van bepaalde activiteiten en de inhoud wilt toevoegen in de volgorde waarin de activiteiten zijn uitgevoerd.
De $$ in het bovenstaande commando vertegenwoordigt het proces-ID voor het commando wanneer u het uitvoert. Het is totaal onnodig om dit te gebruiken, maar het maakt het bijna onmogelijk dat je per ongeluk aan het eind van een bestaand bestand toevoegt in plaats van een nieuw bestand aan te maken. Als u $$ gebruikt, zou het resulterende bestand er zo uit kunnen zien:
$ ls -l BigFile.*-rw-rw-r-- 1 justme justme 931725 Aug 6 12:36 BigFile.582914
Bestanden samenvoegen en sorteren
Linux biedt een aantal interessante manieren om de inhoud van bestanden voor of na de samenvoeging te sorteren.
Inhoud alfabetisch sorteren
Als u de inhoud van het samengevoegde bestand gesorteerd wilt hebben, kunt u de totale inhoud sorteren met een commando als dit:
$ cat myfile.1 myfile.2 myfile.3 | sort > newfile
Als u de inhoud per bestand gegroepeerd wilt houden, sorteert u elk bestand voordat u het aan het nieuwe bestand toevoegt met een commando als dit:
$ for file in `ls myfile.?`; do sort $file >> newfile; done
Bestanden numeriek sorteren
Om de inhoud van een bestand numeriek te sorteren, gebruikt u de -n optie met sort. Deze optie is alleen nuttig als de regels in uw bestanden met getallen beginnen. Hou er rekening mee dat, in de standaard volgorde, “02” als kleiner zou beschouwd worden dan “1”. Gebruik de -n optie wanneer u er zeker van wilt zijn dat de regels in numerieke volgorde worden gesorteerd.
$ cat myfile.1 myfile.2 myfile.3 | sort -n > xyz
Met de -n optie kunt u de inhoud van de bestanden ook op datum sorteren als de regels in de bestanden beginnen met datums in een formaat als “2020-11-03” of “2020/11/03” (jaar, maand, dag formaat). Sorteren op datums in andere indelingen is lastig en vereist veel complexere opdrachten.
Gebruik van plakken
Met de opdracht plakken kunt u de inhoud van bestanden regel voor regel samenvoegen. Wanneer u deze opdracht gebruikt, zal de eerste regel van het samengevoegde bestand de eerste regel bevatten van elk van de bestanden die worden samengevoegd. Hier is een voorbeeld waarin ik hoofdletters heb gebruikt om gemakkelijk te kunnen zien waar de regels vandaan komen:
$ cat file.aA oneA twoA three$ paste file.a file.b file.cA one B one C oneA two B two C twoA three B three C thee B four C four C five
Routeer de uitvoer naar een ander bestand om het op te slaan:
$ paste file.a file.b file.c > merged_content
Aternatief kunt u bestanden aan elkaar plakken zodat de inhoud van elk bestand wordt samengevoegd in een enkele regel. Dit vereist het gebruik van de -s (sequentieel) optie. Merk op hoe de uitvoer deze keer de inhoud van elk bestand toont:
$ paste -s file.a file.b file.cA one A two A threeB one B two B three B fourC one C two C thee C four C five
Gebruik join
Een ander commando om bestanden samen te voegen is join. Met de opdracht join kunt u de inhoud van meerdere bestanden samenvoegen op basis van een gemeenschappelijk veld. U kunt bijvoorbeeld een bestand hebben met de telefoonnummers van een groep collega’s en een ander bestand met hun persoonlijke e-mailadressen, beide vermeld op naam. U kunt join gebruiken om een bestand te maken met zowel telefoonnummers als e-mailadressen.
Een belangrijke beperking is dat de bestanden hun regels in dezelfde volgorde moeten hebben en het join-veld in elk bestand moeten bevatten.
Hier volgt een voorbeeldopdracht:
$ join phone_numbers email_addressesSandra 555-456-1234 [email protected] 555-540-5405John 555-333-1234 [email protected] 555-123-4567 [email protected]
In dit voorbeeld moet het eerste veld (voornamen) in elk bestand bestaan, zelfs als de aanvullende informatie ontbreekt, anders zal de opdracht mislukken met een fout. Het sorteren van de inhoud is nuttig en waarschijnlijk een stuk gemakkelijker te beheren, maar is niet vereist zolang de volgorde consistent is.
Wrap-Up
U hebt onder Linux een heleboel opties voor het samenvoegen en sorteren van gegevens die in afzonderlijke bestanden zijn opgeslagen. De keuzes kunnen sommige anders vervelende taken verrassend gemakkelijk maken.