Monesti sinulla voi olla useita tiedostoja, jotka on yhdistettävä yhdeksi tiedostoksi. Voi olla, että olet aiemmin jakanut yhden tiedoston useisiin tiedostoihin ja haluat vain yhdistää ne takaisin tai sinulla on useita lokitiedostoja, jotka haluat yhdistää yhdeksi. Oli syy mikä tahansa, useiden tekstitiedostojen yhdistäminen yhdeksi tiedostoksi on hyvin helppoa Linuxissa.
Komento, jolla Linuxissa voi ketjuttaa tai yhdistää useita tiedostoja yhdeksi tiedostoksi, on nimeltään cat. Oletusarvoisesti cat-komento ketjuttaa ja tulostaa useita tiedostoja standardilähdölle. Voit ohjata vakiotulosteen tiedostoon käyttämällä ’>’-operaattoria tallentaaksesi tulosteen levylle tai tiedostojärjestelmään.
Toinen hyödyllinen apuohjelma tiedostojen yhdistämiseen on nimeltään join, joka voi yhdistää kahden tiedoston rivit yhteisten kenttien perusteella. Se voi kuitenkin toimia vain kahdessa tiedostossa kerrallaan, ja olen havainnut sen olevan melko hankala käyttää. Käsittelemme tässä postauksessa lähinnä cat-komentoa.
Monien tiedostojen yhdistäminen yhdeksi järjestyksessä
Cat-komento ottaa argumentikseen listan tiedostonimiä. Se, missä järjestyksessä tiedostonimet annetaan komentorivillä, määrää, missä järjestyksessä tiedostot yhdistetään tai yhdistetään. Jos sinulla on siis useita tiedostoja nimeltä tiedosto1.txt, tiedosto2.txt, tiedosto3.txt jne…
bash$ cat file1.txt file2.txt file3.txt file4.txt > ./mergedfile.txt
Yllä oleva komento liittää tiedosto2.txt:n sisällön tiedosto1.txt:n loppuun. Tiedosto3.txt:n sisältö liitetään tiedosto1.txt:n ja tiedosto2.txt:n yhdistetyn sisällön loppuun jne…ja koko yhdistetty tiedosto tallennetaan nimellä yhdistettytiedosto.txt nykyiseen työhakemistoon.
Monesti sinulla saattaa olla kohtuuttoman suuri määrä tiedostoja, mikä vaikeuttaa kaikkien tiedostojen nimien kirjoittamista. Cat-komento hyväksyy säännölliset lausekkeet syötetiedostojen nimiksi, joten voit käyttää niitä argumenttien määrän vähentämiseksi.
bash$ cat file*.txt my*.txt > mergedfile.txt
Tämä yhdistää kaikki nykyisen hakemiston tiedostot, jotka alkavat nimellä file ja joilla on txt-pääte ja joita seuraavat tiedostot, jotka alkavat nimellä my ja joilla on txt-pääte. Säännöllisten lausekkeiden käytössä on oltava varovainen, jos haluat säilyttää tiedostojen järjestyksen. Jos käytät säännöllistä lauseketta väärin, se vaikuttaa siihen, missä järjestyksessä tiedostot yhdistetään.
Nopea ja helppo tapa varmistaa, että tiedostot yhdistetään täsmälleen haluamassasi järjestyksessä, on käyttää jonkin toisen tiedostoluettelointiohjelman, kuten ls:n tai find:n, tulostetta ja liittää se putkella cat-komentoon. Suorita ensin find-komento säännöllisellä lausekkeella ja tarkista tiedostojen järjestys…
bash$ find . -name "file*.txt" -o -name "my*.txt"
Tällöin tiedostot tulostuvat sellaisessa järjestyksessä, että voit tarkistaa sen oikeaksi tai muuttaa sen vastaamaan haluamaasi. Voit sitten putkittaa tämän tulosteen cat-komennolla.
bash$ find . -name "file*.txt" -o -name "my*.txt" | xargs cat > ./mergedfile.txt
Kun yhdistät useita tiedostoja yhdeksi tiedostoksi käyttämällä säännöllisiä lausekkeita niiden yhteensovittamiseen, varsinkin kun se on putkitettu ja kun tulostiedosto ei ole kovin ilmeinen, varmista, että säännöllinen lauseke ei vastaa yhdistetyn tiedoston nimeä. Siinä tapauksessa, että se täsmää, cat-komento on yleensä melko hyvä antamaan virheilmoituksen ”input file is output file”. Varovaisuus auttaa kuitenkin aluksi.
Kahden tiedoston yhdistäminen mielivaltaisessa paikassa
Joskus saatat haluta yhdistää kaksi tiedostoa, mutta tietyssä paikassa tiedoston sisällössä. Tämä on enemmänkin yhden tiedoston sisällön lisääminen toiseen tiedostoon tiettyyn kohtaan tiedostossa.
Jos tiedostojen koot ovat pieniä ja hallittavissa, vi on loistava editorityökalu tähän tarkoitukseen. Muussa tapauksessa vaihtoehtona on jakaa tiedosto ensin ja yhdistää sitten tuloksena olevat tiedostot järjestyksessä. Helpoin tapa jakaa tiedosto on jakaa tiedosto rivinumeroiden perusteella juuri siinä kohdassa, johon haluat lisätä toisen tiedoston.
bash$ split -l 1234 file1.txt
Voit jakaa tiedoston mihin tahansa määrään tulostiedostoja tarpeen mukaan. Yllä olevassa esimerkissä tiedosto file1.txt jaetaan 1234 rivin palasiksi. On täysin mahdollista, että sinulle jää enemmän kuin kaksi tiedostoa, joiden nimet ovat xaa, xab, xac jne. Voit yhdistää ne kaikki takaisin käyttämällä samaa cat-komentoa kuin aiemmin mainittiin.
bash$ cat xaa file2.txt xa{b..z}
Ylläoleva komento yhdistää tiedostot järjestyksessä siten, että tiedosto2.txt:n sisältö on xaa:n ja xab:n sisällön välissä.
Muutama käyttötapaus on silloin, kun sinun on tarpeen yhdistää vain tietyt tietyt osiot tietyistä tiedostoista jostakin ehdosta riippuen. Tämä on erityisen hyödyllistä minulle, kun minun on analysoitava useita suuria lokitiedostoja, mutta olen kiinnostunut vain tietyistä viesteistä tai riveistä. Minun on siis poimittava tärkeät lokiviestit joidenkin kriteerien perusteella useista lokitiedostoista ja tallennettava ne toiseen tiedostoon säilyttäen samalla viestien järjestyksen tai säilyttämällä se.
Vaikka voit tehdä tämän käyttämällä cat- ja grep-komentoja, voit tehdä sen myös pelkällä grep-komennolla.
bash$ grep -h "" logfile*.log > onlyerrors.log
Ylläoleva poimii kaikki rivit, jotka sopivat malliin, ja tallentaa ne toiseen tiedostoon. Sinun on varmistettava, että lokitiedostot ovat järjestyksessä, kun käytät säännöllistä lauseketta niiden täsmäyttämiseen, kuten aiemmin viestissä mainittiin.