Der er en række måder at sammenlægge og sortere tekstfiler på Linux på, men hvordan du gør det afhænger af, hvad du forsøger at opnå – om du blot ønsker at samle indholdet af flere filer i én stor fil eller organisere det på en måde, der gør det lettere at bruge. I dette indlæg vil vi se på nogle kommandoer til sortering og sammenlægning af filindhold og fokusere på, hvordan resultaterne er forskellige.
Brug af cat
Hvis det eneste, du ønsker at gøre, er at samle en gruppe filer i en enkelt fil, er kommandoen cat et nemt valg. Det eneste, du skal gøre, er at skrive “cat” og derefter opregne filerne på kommandolinjen i den rækkefølge, som du vil have dem med i den sammenlagte fil. Omdiriger output fra kommandoen til den fil, du ønsker at oprette. Hvis der allerede findes en fil med det angivne navn, vil den blive overskrevet af den fil, du opretter. For eksempel:
$ cat firstfile secondfile thirdfile > newfile
Hvis du vil tilføje indholdet af en række filer til en eksisterende fil i stedet for at overskrive den, skal du blot ændre > til >>.
$ cat firstfile secondfile thirdfile >> updated_file
Hvis de filer, du fletter, følger en praktisk navngivningskonvention, kan opgaven være endnu enklere. Du behøver ikke at medtage alle filnavne, hvis du kan angive dem ved hjælp af et regulært udtryk. Hvis filerne f.eks. alle slutter med ordet “file” som i eksemplet ovenfor, kan du gøre noget som dette:
$ cat *file > allfiles
Bemærk, at den viste kommando ovenfor vil tilføje filindhold i alfanumerisk rækkefølge. På Linux ville en fil med navnet “filea” blive tilføjet før en fil med navnet “fileA”, men efter en fil med navnet “file7”. Når alt kommer til alt, skal vi ikke bare tænke “ABCDE”, når vi har med en alfanumerisk sekvens at gøre; vi skal tænke “0123456789aAbBcCdDeE”. Du kan altid bruge en kommando som “ls *file” for at se den rækkefølge, som filerne vil blive tilføjet, før filerne slås sammen.
BEMÆRK: Det er en god idé først at sikre dig, at din kommando indeholder alle de filer, som du ønsker i den sammenlagte fil, og ingen andre – især når du bruger et jokertegn som “*”. Og glem ikke, at de sammenlagte filer stadig vil eksistere som separate filer, som du måske ønsker at slette, når sammenlægningen er blevet verificeret.
Sammenlægning af filer efter alder
Hvis du ønsker at sammenlægge dine filer baseret på alderen af hver enkelt fil i stedet for efter filnavne, skal du bruge en kommando som denne:
$ for file in `ls -tr myfile.*`; do cat $file >> BigFile.$$; done
Hvis du bruger indstillingerne -tr (t=tid, r=omvendt), får du en liste over filer i ældste-første aldersrækkefølge. Dette kan f.eks. være nyttigt, hvis du fører en logbog over visse aktiviteter og ønsker at få indholdet tilføjet i den rækkefølge, som aktiviteterne blev udført.
Den $$ i kommandoen ovenfor repræsenterer proces-id’et for kommandoen, når du kører den. Det er helt unødvendigt at bruge dette, men det gør det næsten umuligt, at du ved et uheld tilføjer i slutningen af en eksisterende fil i stedet for at oprette en ny. Hvis du bruger $$, kan den resulterende fil se således ud:
$ ls -l BigFile.*-rw-rw-r-- 1 justme justme 931725 Aug 6 12:36 BigFile.582914
Sammenlægning og sortering af filer
Linux tilbyder nogle interessante måder at sortere filindholdet på før eller efter sammenlægningen.
Sortering af indhold alfabetisk
Hvis du ønsker, at indholdet af den fusionerede fil skal sorteres, kan du sortere det samlede indhold med en kommando som denne:
$ cat myfile.1 myfile.2 myfile.3 | sort > newfile
Hvis du ønsker at beholde indholdet grupperet efter fil, skal du sortere hver enkelt fil, før du tilføjer den til den nye fil med en kommando som denne:
$ for file in `ls myfile.?`; do sort $file >> newfile; done
Sortering af filer numerisk
For at sortere filindholdet numerisk skal du bruge indstillingen -n sammen med sort. Denne indstilling er kun nyttig, hvis linjerne i dine filer begynder med tal. Husk på, at i standardrækkefølgen vil “02” blive betragtet som mindre end “1”. Brug indstillingen -n, når du vil sikre, at linjerne sorteres i numerisk rækkefølge.
$ cat myfile.1 myfile.2 myfile.3 | sort -n > xyz
Med indstillingen -n kan du også sortere filindholdet efter dato, hvis linjerne i filerne begynder med datoer i et format som “2020-11-03” eller “2020/11/03” (år, måned, dag-format). Sortering efter datoer i andre formater vil være vanskelig og vil kræve langt mere komplekse kommandoer.
Anvendelse af paste
Med kommandoen paste kan du sammenføje indholdet af filer linje for linje. Når du bruger denne kommando, vil den første linje i den sammenføjede fil indeholde den første linje i hver af de filer, der bliver sammenføjet. Her er et eksempel, hvor jeg har brugt store bogstaver for at gøre det let at se, hvor linjerne kommer fra:
$ 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
Opdatere output til en anden fil for at gemme det:
$ paste file.a file.b file.c > merged_content
Alternativt kan du indsætte filer sammen, således at indholdet af hver fil er samlet i en enkelt linje. Dette kræver brug af indstillingen -s (sekventiel). Bemærk, hvordan outputtet denne gang viser hver fils indhold:
$ 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
Anvendelse af join
En anden kommando til sammenlægning af filer er join. Med kommandoen join kan du sammenføje indholdet af flere filer baseret på et fælles felt. Du kan f.eks. have en fil, der indeholder telefonnumre for en gruppe kolleger, og en anden fil, der indeholder deres personlige e-mailadresser, og de er begge opført efter personernes navne. Du kan bruge join til at oprette en fil med både telefonnumre og e-mail-adresser.
En vigtig begrænsning er, at filerne skal have deres linjer opført i samme rækkefølge og indeholde join-feltet i hver fil.
Her er en eksempelkommando:
$ join phone_numbers email_addressesSandra 555-456-1234 [email protected] 555-540-5405John 555-333-1234 [email protected] 555-123-4567 [email protected]
I dette eksempel skal det første felt (fornavne) findes i hver fil, selv om de yderligere oplysninger mangler, ellers mislykkes kommandoen med en fejl. Det er nyttigt at sortere indholdet og sandsynligvis meget lettere at administrere, men det er ikke nødvendigt, så længe rækkefølgen er konsistent.
Wrap-Up
Du har mange muligheder på Linux for at flette og sortere data, der er gemt i separate filer. Valgmulighederne kan gøre nogle ellers kedelige opgaver overraskende nemme.