Vaak heb je meerdere bestanden die in een enkel bestand moeten worden samengevoegd. Het kan zijn dat u eerder een bestand in meerdere bestanden hebt gesplitst en deze weer wilt samenvoegen, of dat u meerdere logbestanden hebt die u in één bestand wilt samenvoegen. Wat de reden ook is, het is in Linux heel eenvoudig om meerdere tekstbestanden samen te voegen tot een enkel bestand.
Het commando in Linux om meerdere bestanden samen te voegen tot een bestand heet cat. Het cat commando zal standaard meerdere bestanden samenvoegen en afdrukken naar de standaarduitvoer. U kunt de standaard uitvoer omleiden naar een bestand met behulp van de ‘>’ operator om de uitvoer op te slaan op schijf of bestandssysteem.
Een ander handig hulpprogramma om bestanden samen te voegen heet join dat regels van twee bestanden kan samenvoegen op basis van gemeenschappelijke velden. Het kan echter maar op twee bestanden tegelijk werken, en ik vond het nogal omslachtig in het gebruik. We zullen in dit artikel vooral het cat commando behandelen.
Meerdere bestanden samenvoegen in één op volgorde
Het cat commando neemt een lijst met bestandsnamen als argument. De volgorde waarin de bestandsnamen in de opdrachtregel worden opgegeven, bepaalt de volgorde waarin de bestanden worden samengevoegd. Dus, als u verschillende bestanden hebt met de namen file1.txt, file2.txt, file3.txt enz…
bash$ cat file1.txt file2.txt file3.txt file4.txt > ./mergedfile.txt
De bovenstaande opdracht voegt de inhoud van file2.txt toe aan het eind van file1.txt. De inhoud van file3.txt wordt toegevoegd aan het eind van de samengevoegde inhoud van file1.txt en file2.txt enzovoort… en het hele samengevoegde bestand wordt opgeslagen met de naam mergedfile.txt in de huidige werkdirectory.
Vaak heb je een oneindig groot aantal bestanden, waardoor het moeilijker wordt om alle bestandsnamen in te typen. Het cat commando accepteert reguliere expressies als input bestandsnamen, wat betekent dat je ze kunt gebruiken om het aantal argumenten te verminderen.
bash$ cat file*.txt my*.txt > mergedfile.txt
Dit zal alle bestanden in de huidige directory samenvoegen die beginnen met de naam bestand en een txt extensie hebben, gevolgd door de bestanden die beginnen met my en een txt extensie hebben. Je moet voorzichtig zijn met het gebruik van reguliere expressies, als je de volgorde van bestanden wilt behouden. Een snelle en gemakkelijke manier om ervoor te zorgen dat de bestanden worden samengevoegd in de exacte volgorde die u wilt, is om de uitvoer van een ander programma voor het inventariseren van bestanden, zoals ls of find, te gebruiken en deze naar het commando cat te leiden. Voer eerst het commando find uit met de reguliere expressie en controleer de volgorde van de bestanden…
bash$ find . -name "file*.txt" -o -name "my*.txt"
Hiermee worden de bestanden in de juiste volgorde afgedrukt, zodat u kunt controleren of de volgorde klopt of wijzigen zodat deze overeenkomt met wat u wilt. U kunt die uitvoer vervolgens naar het commando cat pijpen.
bash$ find . -name "file*.txt" -o -name "my*.txt" | xargs cat > ./mergedfile.txt
Wanneer u meerdere bestanden samenvoegt in één bestand met behulp van reguliere expressies om ze te matchen, vooral wanneer het wordt gepijpt en waarbij het uitvoerbestand niet erg voor de hand ligt, moet u ervoor zorgen dat de reguliere expressie niet overeenkomt met de bestandsnaam van het samengevoegde bestand. In het geval dat het wel overeenkomt, is het cat commando meestal vrij goed in het fout-eruit halen met de boodschap “invoerbestand is uitvoerbestand”. Maar het helpt om voorzichtig te zijn om mee te beginnen.
Twee bestanden samenvoegen op willekeurige plaats
Soms wilt u misschien twee bestanden samenvoegen, maar dan op een bepaalde plaats binnen de inhoud van een bestand. Dit is meer het proces van het invoegen van de inhoud van een bestand in een ander bestand op een bepaalde plaats in het bestand.
Als de bestandsgroottes klein en beheersbaar zijn, dan is vi een prima editor-tool om dit te doen. Anders is de optie om eerst het bestand te splitsen en dan de resulterende bestanden in volgorde samen te voegen. De eenvoudigste manier om het bestand te splitsen is op basis van de regelnummers, precies op de plaats waar je het andere bestand wilt invoegen.
bash$ split -l 1234 file1.txt
Je kunt het bestand splitsen in een willekeurig aantal uitvoerbestanden, afhankelijk van wat je nodig hebt. Het bovenstaande voorbeeld zal het bestand file1.txt splitsen in stukken van 1234 regels. Het is heel goed mogelijk dat je meer dan twee bestanden overhoudt, met de namen xaa, xab, xac enz. Je kunt ze allemaal weer samenvoegen met hetzelfde cat commando als eerder genoemd.
bash$ cat xaa file2.txt xa{b..z}
Het bovenstaande commando voegt de bestanden in volgorde samen met de inhoud van file2.txt tussen de inhoud van xaa en xab.
Een ander gebruik is wanneer je alleen specifieke delen van bepaalde bestanden wilt samenvoegen, afhankelijk van een bepaalde voorwaarde. Dit is vooral handig voor mij als ik meerdere grote logbestanden moet analyseren, maar alleen geïnteresseerd ben in bepaalde berichten of regels. Ik moet dus de belangrijke logboekboodschappen op basis van bepaalde criteria uit verschillende logbestanden halen en ze in een ander bestand opslaan, terwijl de volgorde van de boodschappen behouden blijft.
Hoewel je dit kunt doen met de commando’s cat en grep, kun je het ook doen met alleen het grep commando.
bash$ grep -h "" logfile*.log > onlyerrors.log
Het bovenstaande zal alle regels die overeenkomen met het patroon uitpakken en opslaan in een ander bestand. Je moet er wel voor zorgen dat de logbestanden op volgorde staan als je de reguliere expressie gebruikt om ze te matchen, zoals eerder in de post is vermeld.