Det finns ett antal sätt att slå ihop och sortera textfiler på Linux, men hur du gör beror på vad du vill uppnå – om du helt enkelt vill samla innehållet i flera filer i en stor fil eller organisera det på något sätt som gör det lättare att använda. I det här inlägget tittar vi på några kommandon för sortering och sammanslagning av filinnehåll och fokuserar på hur resultaten skiljer sig åt.
Användning av cat
Om det enda du vill göra är att samla ihop en grupp filer till en enda fil är kommandot cat ett enkelt val. Allt du behöver göra är att skriva ”cat” och sedan lista filerna på kommandoraden i den ordning du vill att de ska ingå i den sammanslagna filen. Omdirigera utdata från kommandot till den fil som du vill skapa. Om det redan finns en fil med det angivna namnet kommer den att skrivas över av den du skapar. Till exempel:
$ cat firstfile secondfile thirdfile > newfile
Om du vill lägga till innehållet i en serie filer till en befintlig fil i stället för att skriva över den, ändrar du bara > till >>.
$ cat firstfile secondfile thirdfile >> updated_file
Om filerna du slår ihop följer någon praktisk namnkonvention kan uppgiften vara ännu enklare. Du behöver inte inkludera alla filnamn om du kan ange dem med hjälp av ett reguljärt uttryck. Om filerna till exempel alla slutar med ordet ”file” som i exemplet ovan kan du göra något liknande:
$ cat *file > allfiles
Bemärk att kommandot som visas ovan lägger till filinnehållet i alfanumerisk ordning. På Linux skulle en fil med namnet ”filea” läggas till före en fil med namnet ”fileA”, men efter en fil med namnet ”file7”. När allt kommer omkring behöver vi inte bara tänka ”ABCDE” när vi har att göra med en alfanumerisk sekvens; vi måste tänka ”0123456789aAbBcCdDeE”. Du kan alltid använda ett kommando som ”ls *file” för att se i vilken ordning filerna kommer att läggas till innan du slår ihop filerna.
OBS: Det är en bra idé att först försäkra sig om att ditt kommando inkluderar alla filer som du vill ha med i den sammanslagna filen och inga andra – särskilt när du använder ett jokertecken som ”*”. Glöm inte heller att de sammanslagna filerna fortfarande kommer att finnas kvar som separata filer, som du kanske vill ta bort när sammanslagningen har verifierats.
Sammanslagning av filer efter ålder
Om du vill slå ihop dina filer baserat på åldern på varje fil i stället för efter filnamn använder du ett kommando som det här:
$ for file in `ls -tr myfile.*`; do cat $file >> BigFile.$$; done
Om du använder alternativen -tr (t=tid, r=omvändning) får du en lista med filerna i äldsta-första åldersordning. Detta kan till exempel vara användbart om du för en loggbok över vissa aktiviteter och vill att innehållet ska läggas till i den ordning som aktiviteterna utfördes.
Den $$ i kommandot ovan representerar process-ID för kommandot när du kör det. Det är helt onödigt att använda detta, men det gör det nästan omöjligt att du av misstag lägger till i slutet av en befintlig fil i stället för att skapa en ny. Om du använder $$ kan den resulterande filen se ut så här:
$ ls -l BigFile.*-rw-rw-r-- 1 justme justme 931725 Aug 6 12:36 BigFile.582914
Sammanslagning och sortering av filer
Linux erbjuder några intressanta sätt att sortera filinnehållet före eller efter sammanslagningen.
Sortering av innehåll alfabetiskt
Om du vill att det sammanslagna filinnehållet ska sorteras kan du sortera det totala innehållet med ett kommando som detta:
$ cat myfile.1 myfile.2 myfile.3 | sort > newfile
Om du vill behålla innehållet grupperat per fil, sorterar du varje fil innan du lägger till den i den nya filen med ett kommando som detta:
$ for file in `ls myfile.?`; do sort $file >> newfile; done
Sortering av filer numeriskt
Om du vill sortera filinnehållet numeriskt använder du -n-alternativet tillsammans med sort. Det här alternativet är endast användbart om raderna i dina filer börjar med siffror. Tänk på att i standardordningen skulle ”02” anses vara mindre än ”1”. Använd alternativet -n när du vill försäkra dig om att raderna sorteras i numerisk ordning.
$ cat myfile.1 myfile.2 myfile.3 | sort -n > xyz
Med alternativet -n kan du också sortera filinnehållet efter datum om raderna i filerna börjar med datum i ett format som ”2020-11-03” eller ”2020/11/03” (formatet år, månad, dag). Att sortera datum i andra format blir knepigt och kräver betydligt mer komplexa kommandon.
Användning av paste
Med kommandot paste kan du sammanfoga innehållet i filer rad för rad. När du använder det här kommandot kommer den första raden i den sammanfogade filen att innehålla den första raden i var och en av de sammanfogade filerna. Här är ett exempel där jag har använt stora bokstäver för att göra det lätt att se var raderna kommer ifrån:
$ 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
Omdirigera utmatningen till en annan fil för att spara den:
$ paste file.a file.b file.c > merged_content
Alternativt kan du klistra ihop filer så att innehållet i varje fil sammanfogas på en enda rad. Detta kräver att du använder alternativet -s (sekventiell). Lägg märke till att utmatningen denna gång visar varje fils innehåll:
$ 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
Användning av join
Ett annat kommando för att slå ihop filer är join. Med kommandot join kan du slå ihop innehållet i flera filer baserat på ett gemensamt fält. Du kan till exempel ha en fil som innehåller telefonnummer för en grupp medarbetare och en annan som innehåller deras personliga e-postadresser och båda är listade efter individernas namn. Du kan använda join för att skapa en fil med både telefonnummer och e-postadresser.
En viktig begränsning är att filerna måste ha sina rader listade i samma ordning och innehålla join-fältet i varje fil.
Här är ett exempelkommando:
$ join phone_numbers email_addressesSandra 555-456-1234 [email protected] 555-540-5405John 555-333-1234 [email protected] 555-123-4567 [email protected]
I det här exemplet måste det första fältet (förnamn) finnas i varje fil, även om den ytterligare informationen saknas, annars misslyckas kommandot med ett fel. Att sortera innehållet är till hjälp och förmodligen mycket lättare att hantera, men det är inte nödvändigt så länge ordningen är konsekvent.
Wrap-Up
Du har många alternativ på Linux för att slå samman och sortera data som lagras i separata filer. Valmöjligheterna kan göra vissa annars tråkiga uppgifter förvånansvärt enkla.