Många gånger kan du ha flera filer som behöver slås ihop till en enda fil. Det kan vara så att du tidigare delat upp en enda fil i flera filer och vill bara slå ihop dem igen eller så har du flera loggfiler som du vill slå ihop till en. Oavsett orsaken är det mycket enkelt att slå ihop flera textfiler till en enda fil i Linux.
Kommandot i Linux för att sammanlänka eller slå ihop flera filer till en fil kallas cat. Som standard kommer kommandot cat att sammanfoga och skriva ut flera filer till standardutgången. Du kan omdirigera standardutmatningen till en fil med hjälp av operatorn ”>” för att spara utmatningen på disk eller i filsystemet.
Ett annat användbart verktyg för att sammanfoga filer kallas join som kan sammanfoga rader i två filer baserat på gemensamma fält. Det kan dock bara fungera på två filer åt gången, och jag har tyckt att det är ganska besvärligt att använda. Vi kommer främst att täcka cat-kommandot i det här inlägget.
Sammanslagning av flera filer till en i ordning
Cat-kommandot tar en lista med filnamn som argument. Ordningen i vilken filnamnen anges på kommandoraden dikterar i vilken ordning filerna slås samman eller kombineras. Så om du har flera filer som heter file1.txt, file2.txt, file3.txt osv…
bash$ cat file1.txt file2.txt file3.txt file4.txt > ./mergedfile.txt
Ovanstående kommando kommer att lägga till innehållet i file2.txt i slutet av file1.txt. Innehållet i file3.txt läggs till i slutet av det sammanslagna innehållet i file1.txt och file2.txt och så vidare… och hela den sammanslagna filen sparas med namnet mergedfile.txt i den aktuella arbetskatalogen.
Många gånger kan det hända att du har ett orimligt stort antal filer vilket gör det svårare att skriva in alla filnamn. Kommandot cat accepterar reguljära uttryck som inmatningsfilnamn, vilket innebär att du kan använda dem för att minska antalet argument.
bash$ cat file*.txt my*.txt > mergedfile.txt
Detta kommer att slå samman alla filer i den aktuella katalogen som börjar med namnet file och har ett txt-tillägg följt av filerna som börjar med my och har ett txt-tillägg. Du måste vara försiktig när du använder reguljära uttryck om du vill bevara filernas ordning. Om du gör fel på det reguljära uttrycket kommer det att påverka den exakta ordningen i vilken filerna slås samman.
Ett snabbt och enkelt sätt att se till att filerna slås samman i den exakta ordning du vill ha är att använda utdata från ett annat program som listar filer, t.ex. ls eller find, och pipa det till kommandot cat. Utför först kommandot find med det reguljära uttrycket och verifiera filordningen…
bash$ find . -name "file*.txt" -o -name "my*.txt"
Detta kommer att skriva ut filerna i en sådan ordning att du kan verifiera att den är korrekt eller ändra den så att den stämmer överens med vad du vill. Du kan sedan pipa denna utdata till kommandot cat.
bash$ find . -name "file*.txt" -o -name "my*.txt" | xargs cat > ./mergedfile.txt
När du slår ihop flera filer till en fil med hjälp av reguljära uttryck för att matcha dem, särskilt när det är pipat och där utdatafilen inte är särskilt uppenbar, ska du se till att det reguljära uttrycket inte matchar filnamnet på den sammanslagna filen. I det fall det stämmer överens brukar cat-kommandot vara ganska bra på att ge felmeddelanden med meddelandet ”input file is output file”. Men det hjälper att vara försiktig till att börja med.
Sammanslagning av två filer på godtycklig plats
Ibland vill du kanske sammanfoga två filer, men på en viss plats inom innehållet i en fil. Detta liknar mer processen att infoga innehållet i en fil i en annan vid en viss position i filen.
Om filstorlekarna är små och hanterbara är vi ett utmärkt redigeringsverktyg för att göra detta. Annars är alternativet att först dela upp filen och sedan slå ihop de resulterande filerna i ordning. Det enklaste sättet att dela upp filen är baserat på radnumren, exakt där du vill infoga den andra filen.
bash$ split -l 1234 file1.txt
Du kan dela upp filen i ett valfritt antal utdatafiler beroende på dina krav. Exemplet ovan kommer att dela upp filen file1.txt i bitar med 1234 rader. Det är fullt möjligt att du får mer än två filer med namnen xaa, xab, xac etc. Du kan sammanfoga alla filer med samma cat-kommando som tidigare nämnts.
bash$ cat xaa file2.txt xa{b..z}
Ovanstående kommando kommer att sammanfoga filerna i tur och ordning, med innehållet i file2.txt mellan innehållet i xaa och xab.
Ett annat användningsområde är när du behöver sammanfoga endast specifika delar av vissa filer beroende på vissa villkor. Detta är särskilt användbart för mig när jag måste analysera flera stora loggfiler, men bara är intresserad av vissa meddelanden eller rader. Jag behöver alltså extrahera de viktiga loggmeddelandena utifrån vissa kriterier från flera loggfiler och spara dem i en annan fil samtidigt som jag behåller eller bevarar ordningen på meddelandena.
Tyvärr kan du göra det här med hjälp av kommandona cat och grep, men du kan också göra det med bara kommandot grep.
bash$ grep -h "" logfile*.log > onlyerrors.log
Ovanstående kommer att extrahera alla rader som matchar mönstret och spara dem i en annan fil. Du måste se till att loggfilerna är i ordning när du använder det reguljära uttrycket för att matcha dem, vilket nämndes tidigare i inlägget.