Ci sono diversi modi per unire e ordinare i file di testo su Linux, ma come procedere dipende da cosa si sta cercando di ottenere – se si vuole semplicemente mettere il contenuto di più file in un unico grande file, o organizzarlo in qualche modo che lo renda più facile da usare. In questo post, esamineremo alcuni comandi per ordinare e unire il contenuto dei file e ci concentreremo su come i risultati differiscono.
Usare cat
Se tutto quello che vuoi fare è riunire un gruppo di file in un unico file, il comando cat è una scelta facile. Tutto quello che dovete fare è digitare “cat” e poi elencare i file sulla linea di comando nell’ordine in cui volete che siano inclusi nel file unito. Reindirizzate l’output del comando al file che volete creare. Se un file con il nome specificato esiste già, sarà sovrascritto da quello che state creando. Per esempio:
$ cat firstfile secondfile thirdfile > newfile
Se volete aggiungere il contenuto di una serie di file a un file esistente piuttosto che sovrascriverlo, cambiate semplicemente il > in >>.
$ cat firstfile secondfile thirdfile >> updated_file
Se i file che state unendo seguono qualche comoda convenzione di denominazione, il compito può essere ancora più semplice. Non dovrete includere tutti i nomi dei file se potete specificarli usando un’espressione regolare. Per esempio, se i file finiscono tutti con la parola “file” come nell’esempio precedente, potreste fare qualcosa del genere:
$ cat *file > allfiles
Nota che il comando mostrato sopra aggiungerà il contenuto dei file in ordine alfanumerico. Su Linux, un file chiamato “filea” verrebbe aggiunto prima di uno chiamato “fileA”, ma dopo uno chiamato “file7”. Dopo tutto, non dobbiamo solo pensare “ABCDE” quando abbiamo a che fare con una sequenza alfanumerica; dobbiamo pensare “0123456789aAbBcCdDeE”. Puoi sempre usare un comando come “ls *file” per vedere l’ordine in cui i file saranno aggiunti prima di unire i file.
NOTA: è una buona idea assicurarsi prima che il tuo comando includa tutti i file che vuoi nel file unito e nessun altro – specialmente quando stai usando un carattere jolly come “*”. E non dimenticate che i file fusi esisteranno ancora come file separati, che potreste voler cancellare una volta che la fusione è stata verificata.
Fusione di file per età
Se volete unire i vostri file in base all’età di ogni file piuttosto che ai nomi dei file, usate un comando come questo:
$ for file in `ls -tr myfile.*`; do cat $file >> BigFile.$$; done
Utilizzando le opzioni -tr (t=time, r=reverse) avrete una lista di file in ordine di età più vecchio-primo. Questo può essere utile, per esempio, se stai tenendo un registro di certe attività e vuoi che il contenuto sia aggiunto nell’ordine in cui le attività sono state eseguite.
Il $$ nel comando sopra rappresenta l’ID del processo per il comando quando lo esegui. È completamente inutile usarlo, ma rende quasi impossibile che tu aggiunga inavvertitamente alla fine di un file esistente invece di crearne uno nuovo. Se usi $$, il file risultante potrebbe assomigliare a questo:
$ ls -l BigFile.*-rw-rw-r-- 1 justme justme 931725 Aug 6 12:36 BigFile.582914
Fusione e ordinamento dei file
Linux fornisce alcuni modi interessanti per ordinare il contenuto dei file prima o dopo la fusione.
Ordinamento del contenuto in ordine alfabetico
Se vuoi che il contenuto del file fuso sia ordinato, puoi ordinare il contenuto complessivo con un comando come questo:
$ cat myfile.1 myfile.2 myfile.3 | sort > newfile
Se vuoi mantenere il contenuto raggruppato per file, ordina ogni file prima di aggiungerlo al nuovo file con un comando come questo:
$ for file in `ls myfile.?`; do sort $file >> newfile; done
Ordinamento numerico dei file
Per ordinare il contenuto dei file numericamente, usa l’opzione -n con sort. Questa opzione è utile solo se le linee dei tuoi file iniziano con dei numeri. Tieni presente che, nell’ordine predefinito, “02” sarebbe considerato più piccolo di “1”. Usa l’opzione -n quando vuoi assicurarti che le linee siano ordinate in ordine numerico.
$ cat myfile.1 myfile.2 myfile.3 | sort -n > xyz
L’opzione -n ti permette anche di ordinare il contenuto dei file per data se le linee nei file iniziano con date in un formato come “2020-11-03” o “2020/11/03” (formato anno, mese, giorno). L’ordinamento per date in altri formati sarà complicato e richiederà comandi molto più complessi.
Utilizzando paste
Il comando paste permette di unire il contenuto dei file riga per riga. Quando usate questo comando, la prima linea del file unito conterrà la prima linea di ogni file unito. Ecco un esempio in cui ho usato lettere maiuscole per rendere facile vedere da dove vengono le linee:
$ 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
Ridirigi l’output in un altro file per salvarlo:
$ paste file.a file.b file.c > merged_content
In alternativa, puoi incollare i file insieme in modo che il contenuto di ogni file sia unito in una singola linea. Questo richiede l’uso dell’opzione -s (sequenziale). Nota come l’output questa volta mostra il contenuto di ogni file:
$ 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
Usando join
Un altro comando per unire i file è join. Il comando join ti permette di unire il contenuto di più file sulla base di un campo comune. Per esempio, potresti avere un file che contiene numeri di telefono per un gruppo di colleghi e un altro che contiene i loro indirizzi email personali e sono entrambi elencati in base ai nomi delle persone. Potete usare join per creare un file con entrambi i numeri di telefono e gli indirizzi email.
Una restrizione importante è che i file devono avere le loro linee elencate nello stesso ordine e includere il campo join in ogni file.
Ecco un comando di esempio:
$ join phone_numbers email_addressesSandra 555-456-1234 [email protected] 555-540-5405John 555-333-1234 [email protected] 555-123-4567 [email protected]
In questo esempio, il primo campo (nomi) deve esistere in ogni file anche se le informazioni aggiuntive mancano o il comando fallirà con un errore. Ordinare i contenuti è utile e probabilmente molto più facile da gestire, ma non è necessario finché l’ordine è coerente.
Wrap-Up
Hai molte opzioni su Linux per unire e ordinare i dati memorizzati in file separati. Le scelte possono rendere alcuni compiti altrimenti noiosi sorprendentemente facili.