Tiedostojen yhdistäminen ja lajittelu Linuxissa

, Author

Tekstitiedostojen yhdistämiseen ja lajitteluun on useita tapoja Linuxissa, mutta se, miten se tehdään, riippuu siitä, mitä yrität saavuttaa – haluatko yksinkertaisesti koota useiden tiedostojen sisällön yhdeksi isoksi tiedostoksi vai järjestää sen jollakin tavalla, joka helpottaa sen käyttöä. Tässä postauksessa tarkastelemme muutamia komentoja tiedostojen sisällön lajitteluun ja yhdistämiseen ja keskitymme siihen, miten tulokset eroavat toisistaan.

Cat-komennon käyttäminen

Jos haluat vain vetää ryhmän tiedostoja yhteen tiedostoon, cat-komento on helppo valinta. Sinun tarvitsee vain kirjoittaa ”cat” ja luetella tiedostot komentorivillä siinä järjestyksessä, jossa haluat niiden sisältyvän yhdistettyyn tiedostoon. Ohjaa komennon tuloste haluamaasi tiedostoon. Jos määritetyllä nimellä oleva tiedosto on jo olemassa, se korvataan luomallasi tiedostolla. Esimerkiksi:

$ cat firstfile secondfile thirdfile > newfile

Jos haluat lisätä sarjatiedoston sisällön olemassa olevaan tiedostoon sen sijaan, että korvaisit sen, vaihda vain > muotoon >>.

$ cat firstfile secondfile thirdfile >> updated_file

Jos yhdistettävät tiedostot noudattavat jotakin kätevää nimeämiskäytäntöä, tehtävä voi olla vieläkin yksinkertaisempi. Sinun ei tarvitse sisällyttää kaikkia tiedostonimiä, jos voit määrittää ne säännöllisen lausekkeen avulla. Jos esimerkiksi kaikki tiedostot päättyvät sanaan ”file”, kuten yllä olevassa esimerkissä, voit tehdä jotakuinkin näin:

$ cat *file > allfiles

Huomaa, että yllä esitetty komento lisää tiedostojen sisällön aakkosnumeerisessa järjestyksessä. Linuxissa tiedosto nimeltä ”filea” lisättäisiin ennen tiedostoa nimeltä ”fileA”, mutta tiedoston nimeltä ”file7” jälkeen. Loppujen lopuksi meidän ei tarvitse ajatella vain ”ABCDE”, kun käsittelemme aakkosnumeerista järjestystä, vaan meidän on ajateltava ”0123456789aAbBcCdDeE”. Voit aina käyttää komentoa kuten ”ls *tiedosto” nähdäksesi, missä järjestyksessä tiedostot lisätään ennen tiedostojen yhdistämistä.

Huomautus: On hyvä ajatus varmistaa ensin, että komento sisältää kaikki tiedostot, jotka haluat yhdistettyyn tiedostoon, eikä muita tiedostoja – varsinkin kun käytät jokerimerkkiä kuten ”*”. Äläkä unohda, että yhdistetyt tiedostot ovat edelleen olemassa erillisinä tiedostoina, jotka saatat haluta poistaa, kun yhdistäminen on varmistettu.

Tiedostojen yhdistäminen iän mukaan

Jos haluat yhdistää tiedostosi pikemminkin kunkin tiedoston iän kuin tiedostojen nimien mukaan, käytä tämänkaltaista komentoa:

$ for file in `ls -tr myfile.*`; do cat $file >> BigFile.$$; done

Ohjeita -tr (t=aikaa, r=käännös) käyttämällä saat listan tiedostojen iästä vanhimmasta ensimmäiseen. Tämä voi olla hyödyllistä esimerkiksi silloin, jos pidät lokia tietyistä toiminnoista ja haluat, että sisältö lisätään siinä järjestyksessä, jossa toiminnot suoritettiin.

Yllä olevassa komennossa oleva $$ edustaa komennon prosessitunnusta, kun komento suoritetaan. Tämän käyttäminen on täysin tarpeetonta, mutta se tekee lähes mahdottomaksi sen, että lisäät vahingossa olemassa olevan tiedoston loppuun uuden tiedoston luomisen sijaan. Jos käytät $$, tuloksena syntyvä tiedosto saattaa näyttää tältä:

$ ls -l BigFile.*-rw-rw-r-- 1 justme justme 931725 Aug 6 12:36 BigFile.582914

Tiedostojen yhdistäminen ja lajittelu

Linux tarjoaa joitakin mielenkiintoisia tapoja lajitella tiedostojen sisältö ennen tai jälkeen yhdistämisen.

Sisällön lajittelu aakkosjärjestyksessä

Jos haluat lajitella yhdistetyn tiedoston sisällön, voit lajitella kokonaissisällön tällaisella komennolla:

$ cat myfile.1 myfile.2 myfile.3 | sort > newfile

Jos haluat pitää sisällön ryhmiteltynä tiedostokohtaisesti, lajittele kukin tiedosto ennen sen lisäämistä uuteen tiedostoon tällaisella komennolla:

$ for file in `ls myfile.?`; do sort $file >> newfile; done

Tiedostojen lajitteleminen numeerisesti

Tiedostojen sisällön lajittelemiseksi numeerisesti käytä -n-lisävaihtoehtoa lajittelun (sortauksen (sortauksen) kanssa. Tämä vaihtoehto on hyödyllinen vain, jos tiedostojen rivit alkavat numeroilla. Muista, että oletusjärjestyksessä ”02” katsottaisiin pienemmäksi kuin ”1”. Käytä -n-vaihtoehtoa, kun haluat varmistaa, että rivit lajitellaan numerojärjestykseen.

$ cat myfile.1 myfile.2 myfile.3 | sort -n > xyz

Vaihtoehdon -n avulla voit myös lajitella tiedostojen sisällön päivämäärän mukaan, jos tiedostojen rivit alkavat päivämäärillä, joiden muoto on esimerkiksi ”2020-11-03” tai ”2020/11/03” (vuosi-, kuukausi- ja päivämuoto). Muissa muodoissa olevien päivämäärien lajittelu on hankalaa ja vaatii paljon monimutkaisempia komentoja.

Paste-komennon käyttäminen

Paste-komennon avulla voit yhdistää tiedostojen sisällön riveittäin. Kun käytät tätä komentoa, yhdistetyn tiedoston ensimmäinen rivi sisältää kunkin yhdistettävän tiedoston ensimmäisen rivin. Tässä on esimerkki, jossa olen käyttänyt isoja kirjaimia, jotta on helppo nähdä, mistä rivit ovat peräisin:

$ 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

Ohjaa tuloste toiseen tiedostoon tallentaaksesi sen:

$ paste file.a file.b file.c > merged_content

Vaihtoehtoisesti voit liittää tiedostoja yhteen siten, että kunkin tiedoston sisältö yhdistetään yhdelle riville. Tämä edellyttää -s (sequential) -vaihtoehdon käyttöä. Huomaa, miten tulosteessa näkyy tällä kertaa kunkin tiedoston sisältö:

$ 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

Käyttämällä join

Toinen komento tiedostojen yhdistämiseen on join. Join-komennon avulla voit yhdistää useiden tiedostojen sisällön yhteisen kentän perusteella. Sinulla voi esimerkiksi olla yksi tiedosto, joka sisältää ryhmän työtovereiden puhelinnumerot, ja toinen tiedosto, joka sisältää heidän henkilökohtaiset sähköpostiosoitteensa, ja molemmat on lueteltu henkilöiden nimien mukaan. Voit käyttää join-komentoa luodaksesi tiedoston, jossa on sekä puhelinnumerot että sähköpostiosoitteet.

Yksi tärkeä rajoitus on, että tiedostojen rivien on oltava lueteltu samassa järjestyksessä ja että jokaisessa tiedostossa on oltava join-kenttä.

Tässä on esimerkkikomento:

$ join phone_numbers email_addressesSandra 555-456-1234 [email protected] 555-540-5405John 555-333-1234 [email protected] 555-123-4567 [email protected]

Tässä esimerkissä ensimmäisen kentän (etunimet) on oltava olemassa kummassakin tiedostossa, vaikka lisätietoja puuttuisi, muutoin komento epäonnistuu virheellä. Sisällön lajittelu on hyödyllistä ja luultavasti paljon helpompaa hallita, mutta sitä ei tarvita, kunhan järjestys on johdonmukainen.

Wrap-Up

Linuxissa on paljon vaihtoehtoja erillisiin tiedostoihin tallennettujen tietojen yhdistämiseen ja lajitteluun. Valinnat voivat tehdä joistakin muuten ikävistä tehtävistä yllättävän helppoja.

Vastaa

Sähköpostiosoitettasi ei julkaista.