Molte volte si possono avere più file che devono essere uniti in un unico file. Potrebbe essere che tu abbia precedentemente diviso un singolo file in più file, e vuoi semplicemente unirli di nuovo o hai diversi file di log che vuoi unire in uno solo. Qualunque sia la ragione, è molto facile unire più file di testo in un unico file in Linux.

Il comando in Linux per concatenare o unire più file in un unico file è chiamato cat. Il comando cat di default concatena e stampa più file sullo standard output. Puoi reindirizzare l’output standard a un file usando l’operatore ‘>’ per salvare l’output sul disco o sul file system.

Un’altra utile utility per unire i file è chiamata join che può unire le linee di due file sulla base di campi comuni. Tuttavia può lavorare solo su due file alla volta, e l’ho trovata piuttosto ingombrante da usare. Tratteremo principalmente il comando cat in questo post.

Fusione di più file in uno solo in ordine

Il comando cat prende come argomento una lista di nomi di file. L’ordine in cui i nomi dei file sono specificati nella linea di comando detta l’ordine in cui i file sono uniti o combinati. Quindi, se hai diversi file chiamati file1.txt, file2.txt, file3.txt ecc…

bash$ cat file1.txt file2.txt file3.txt file4.txt > ./mergedfile.txt

Il comando di cui sopra aggiungerà il contenuto del file2.txt alla fine del file1.txt. Il contenuto di file3.txt viene aggiunto alla fine dei contenuti fusi di file1.txt e file2.txt e così via… e l’intero file fuso viene salvato con il nome mergedfile.txt nella directory di lavoro corrente.

Molte volte, potresti avere un numero eccessivo di file che rende difficile digitare tutti i nomi dei file. Il comando cat accetta espressioni regolari come nomi di file di input, il che significa che potete usarle per ridurre il numero di argomenti.

bash$ cat file*.txt my*.txt > mergedfile.txt

Questo unirà tutti i file nella directory corrente che iniziano con il nome file e ha un’estensione txt seguito dai file che iniziano con my e ha un’estensione txt. Dovete fare attenzione all’uso delle espressioni regolari, se volete preservare l’ordine dei file. Se sbagliate l’espressione regolare, influenzerà l’ordine esatto in cui i file vengono uniti.

Un modo semplice e veloce per assicurarsi che i file vengano uniti nell’ordine esatto che volete, è quello di usare l’output di un altro programma di elencazione di file come ls o find e collegarlo al comando cat. Prima esegui il comando find con l’espressione regolare e verifica l’ordine dei file…

bash$ find . -name "file*.txt" -o -name "my*.txt"

Questo stamperà i file in un ordine tale che potrai verificare che sia corretto o modificarlo per farlo corrispondere a quello che vuoi. Si può quindi convogliare l’output nel comando cat.

bash$ find . -name "file*.txt" -o -name "my*.txt" | xargs cat > ./mergedfile.txt

Quando si uniscono più file in un unico file usando espressioni regolari per abbinarli, specialmente quando è convogliato e dove il file di output non è molto evidente, assicurarsi che l’espressione regolare non corrisponda al nome del file unito. Nel caso in cui corrisponda, di solito il comando cat è abbastanza bravo a dare un errore con il messaggio “input file is output file”. Ma aiuta a stare attenti all’inizio.

Fusione di due file in una posizione arbitraria

A volte potresti voler unire due file, ma in una posizione particolare all’interno del contenuto di un file. Questo è più simile al processo di inserire il contenuto di un file in un altro in una particolare posizione nel file.

Se le dimensioni dei file sono piccole e gestibili, allora vi è un ottimo strumento di editing per fare questo. Altrimenti l’opzione è quella di dividere prima il file e poi unire i file risultanti in ordine. Il modo più semplice per dividere il file è basato sui numeri di linea, esattamente nel punto in cui vuoi inserire l’altro file.

bash$ split -l 1234 file1.txt

Puoi dividere il file in qualsiasi numero di file di output a seconda delle tue esigenze. L’esempio precedente dividerà il file file1.txt in pezzi di 1234 linee. È abbastanza possibile che tu possa finire con più di due file, chiamati xaa, xab, xac ecc… Puoi unirli tutti di nuovo usando lo stesso comando cat come menzionato prima.

bash$ cat xaa file2.txt xa{b..z}

Il comando di cui sopra unirà i file in ordine con il contenuto del file2.txt tra il contenuto di xaa e xab.

Un altro caso d’uso è quando hai bisogno di unire solo parti specifiche di certi file a seconda di qualche condizione. Questo è particolarmente utile per me quando devo analizzare diversi grandi file di log, ma sono interessato solo ad alcuni messaggi o linee. Quindi, avrò bisogno di estrarre i messaggi di log importanti basati su alcuni criteri da diversi file di log e salvarli in un file diverso mantenendo o preservando l’ordine dei messaggi.

Anche se puoi fare questo usando i comandi cat e grep, puoi farlo anche solo con il comando grep.

bash$ grep -h "" logfile*.log > onlyerrors.log

Questo estrarrà tutte le linee che corrispondono allo schema e le salverà in un altro file. Dovrai assicurarti che i file di log siano in ordine quando usi l’espressione regolare per abbinarli, come menzionato prima nel post.

.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.