De multe ori este posibil să aveți mai multe fișiere care trebuie să fuzioneze într-un singur fișier. Ar putea fi faptul că ați împărțit anterior un singur fișier în mai multe fișiere și doriți doar să le uniți din nou sau aveți mai multe fișiere de jurnal pe care doriți să le uniți într-unul singur. Oricare ar fi motivul, este foarte ușor să unificați mai multe fișiere text într-un singur fișier în Linux.
Comanda din Linux pentru a concatena sau uni mai multe fișiere într-un singur fișier se numește cat. Comanda cat, în mod implicit, va concatena și va imprima mai multe fișiere pe ieșirea standard. Puteți redirecționa ieșirea standard către un fișier folosind operatorul ‘>’ pentru a salva ieșirea pe disc sau în sistemul de fișiere.
Un alt utilitar util pentru a uni fișiere se numește join care poate uni liniile a două fișiere pe baza unor câmpuri comune. Cu toate acestea, nu poate funcționa decât pe două fișiere la un moment dat și mi s-a părut destul de greu de utilizat. În această postare vom aborda în principal comanda cat.
Fondează mai multe fișiere într-unul singur în ordine
Comanda cat ia ca argument o listă de nume de fișiere. Ordinea în care sunt specificate numele fișierelor în linia de comandă dictează ordinea în care fișierele sunt fuzionate sau combinate. Astfel, dacă aveți mai multe fișiere numite file1.txt, file2.txt, file3.txt etc…
bash$ cat file1.txt file2.txt file3.txt file4.txt > ./mergedfile.txt
Comanda de mai sus va adăuga conținutul fișierului2.txt la sfârșitul fișierului1.txt. Conținutul fișierului3.txt este adăugat la sfârșitul conținutului fuzionat al fișierului1.txt și al fișierului2.txt și așa mai departe…iar întregul fișier fuzionat este salvat cu numele fuzionatfile.txt în directorul de lucru curent.
De multe ori, este posibil să aveți un număr exagerat de mare de fișiere, ceea ce îngreunează tastarea tuturor numelor de fișiere. Comanda cat acceptă expresii regulate ca nume de fișiere de intrare, ceea ce înseamnă că le puteți folosi pentru a reduce numărul de argumente.
bash$ cat file*.txt my*.txt > mergedfile.txt
Aceasta va fuziona toate fișierele din directorul curent care încep cu numele fișier și au extensia txt, urmate de fișierele care încep cu my și au extensia txt. Trebuie să fiți atenți la utilizarea expresiilor regulate, dacă doriți să păstrați ordinea fișierelor. Dacă greșiți expresia regulată, aceasta va afecta ordinea exactă în care sunt îmbinate fișierele.
O modalitate rapidă și ușoară de a vă asigura că fișierele sunt îmbinate în ordinea exactă pe care o doriți, este să folosiți ieșirea unui alt program de listare a fișierelor, cum ar fi ls sau find, și să o introduceți în comanda cat. Mai întâi executați comanda find cu expresia regulată și verificați ordinea fișierelor…
bash$ find . -name "file*.txt" -o -name "my*.txt"
Aceasta va imprima fișierele în ordine astfel încât să puteți verifica dacă este corectă sau să o modificați pentru a corespunde cu ceea ce doriți. Puteți apoi să canalizați această ieșire în comanda cat.
bash$ find . -name "file*.txt" -o -name "my*.txt" | xargs cat > ./mergedfile.txt
Când uniți mai multe fișiere într-un singur fișier folosind expresii regulate pentru a le potrivi, în special când este canalizat și când fișierul de ieșire nu este foarte evident, asigurați-vă că expresia regulată nu se potrivește cu numele de fișier al fișierului fuzionat. În cazul în care se potrivește, de obicei, comanda cat se descurcă destul de bine la erori cu mesajul „fișierul de intrare este fișierul de ieșire”. Dar ajută să fiți atenți la început.
Fondează două fișiere la o locație arbitrară
Câteodată puteți dori să fuzionați două fișiere, dar la o anumită locație din conținutul unui fișier. Acest lucru seamănă mai degrabă cu procesul de inserare a conținutului unui fișier într-un alt fișier, într-o anumită poziție din fișier.
Dacă dimensiunile fișierelor sunt mici și ușor de gestionat, atunci vi este un instrument de editare excelent pentru a face acest lucru. În caz contrar, opțiunea este de a diviza mai întâi fișierul și apoi de a uni în ordine fișierele rezultate. Cel mai simplu mod de a diviza fișierul este pe baza numerelor de linie, exact în locul în care doriți să introduceți celălalt fișier.
bash$ split -l 1234 file1.txt
Puteți diviza fișierul în orice număr de fișiere de ieșire, în funcție de cerințele dumneavoastră. Exemplul de mai sus va diviza fișierul file1.txt în bucăți de 1234 de linii. Este foarte posibil să vă treziți cu mai mult de două fișiere, numite xaa, xab, xac etc. Puteți să le unificați pe toate înapoi folosind aceeași comandă cat, așa cum am menționat mai devreme.
bash$ cat xaa file2.txt xa{b..z}
Comanda de mai sus va unifica fișierele în ordine, conținutul fișierului2.txt între conținutul xaa și xab.
Un alt caz de utilizare este atunci când trebuie să unificați doar anumite părți specifice din anumite fișiere în funcție de anumite condiții. Acest lucru este deosebit de util pentru mine atunci când trebuie să analizez mai multe fișiere jurnal mari, dar sunt interesat doar de anumite mesaje sau linii. Astfel, voi avea nevoie să extrag mesajele de jurnal importante în funcție de anumite criterii din mai multe fișiere de jurnal și să le salvez într-un alt fișier, menținând sau păstrând în același timp ordinea mesajelor.
Chiar dacă puteți face acest lucru folosind comenzile cat și grep, îl puteți face și cu doar comanda grep.
bash$ grep -h "" logfile*.log > onlyerrors.log
Comenzile de mai sus vor extrage toate liniile care se potrivesc cu modelul și le vor salva într-un alt fișier. Va trebui să vă asigurați că fișierele jurnal sunt în ordine atunci când folosiți expresia regulată pentru a le potrivi, așa cum s-a menționat mai devreme în post.
.