Se abbiamo un file contenente dati in formati di matrice (numeri e stringhe)
1 2 3
4 5 6
7 8 9
possiamo ottenere la matrice trasposta, cioe’ lo scambio delle righe con le colonne, attraverso la sequenza di comandi
cat nomefile | awk ‘{for(j=1;j<=NF;j++){arr[j]=arr[j]" "$j}} END {for(i=1;i<=NF;i++) print arr[i]}’ | sed ’s/^\ //’
Il risultato sara’
1 4 7
2 5 8
3 6 9
Credits to jaduks
Quando lanciamo nel nostro terminale un programma che puo’ durare diverse ore, puo’ essere comodo potersi scollegare dal terminale stesso, oppure dall’intero sistema, in particolare se il pc che stiamo utilizzando non e’ il nostro personale. Oppure nel caso in cui stiamo lanciando un’applicazione su un pc remoto via collegamento ssh.
In questi casi ci viene in aiuto l’utili screen. Con questo piccolo programma e’ possibile aprire un terminale virtuale da cui scollegarci senza fermare le applicazioni lanciate per poi ricollegarci allo stesso terminale in un altro momento o da un altro pc.
Innanzi tutto lanciamo screen
screen
Dopo aver letto le eventuali note iniziali ed aver premuto invio, ci troveremo davanti l’ambiente screen, che ricalca in tutto e per tutto un normale terminale. Possiamo quindi lanciare la nostra applicazione nel modo consueto.
Per scollegarci dal terminale virtuale non dobbiamo far altro che digitare in sequenza i tasti Ctrl+a seguito da d. Saremo cosi’ tornati al nostro consueto terminale.
Per ripristinare invece una sessione screen precedentemente abbandonata, basta usare il comando
screen -r
Se avevamo messo in sospeso piu’ d una sessione screen, il programma ci chiedera’ quale ripristinare, proponendoci una lista. Bastera’ ripetere quindi lo stesso comando indicando anche l’ID della sessione da ripristinare.
Nella scrittura di procedure o script bash a volte si ha la necessita’ di generare liste di numeri.
Ci sono due modi semplici di compiere tale operazione.
Il primo fa’ uso del comando seq e la sua sintassi e’
seq start step stop
Ad esempio, il comando
seq 1 1 4
genera la seguente lista verticale
1
2
3
4
Il separatore tra due elementi puo’ essere modificato dal valore standard (\n) in uno qualsiasi, ad esempio uno spazio, tramite il flag “-s”, in modo di ottenere una lista orizzontale.
Il secondo sfrutta le proprieta’ stesse della shell e consiste nel comando
echo {1..13}
che generrera’ la lista orizzontale
1 2 3 4 5 6 7 8 9 10 11 12 13
Questo secondo metodo genera solo liste orizzontali, ma puo’ essere usato anche con le lettere minuscole e maiuscole.
Se stiamo lavorando su due o piu’ file contenenti, ad esempio, delle colonne di dati e volessimo creare un unico file con tutti i dati di origine ci basta utilizzare il comando paste.
paste -d" " file1 file2 file3…
In questo modo verra’ mostrato a schermo il contento, ma possiamo sempre reindirizzarlo su un altro file. L’opzione -d permette di specificare quale carattere utilizzare per delimitare i due file, in questo caso uno spazio.
Ad esempio se il file nomi.txt contiene
Mario
Pinco
Giulio
ed il file cognomi.txt contiene
Rossi
Pallino
Cesare
il risultato sara’
Mario Rossi
Pinco Pallino
Giulio Cesare
Nel caso i due file abbiamo lunghezza diversa il comando funziona ugualmente ma si dovra’ prestare attenzione al risultato ottenuto.
Volete estrarre uno o piu’ campi da un file? Conosco due metodi per farlo, ma sicuramente ve ne saranno numerosi altri (potenza di linux
).
Il primo fa uso del comando cut e va’ usato cosi’
cut -d" " -f2 nome_file
.
Questo comando estrae il secondo campo da ogni riga del file indicato. L’opzione -d” “ indica a cut di usare lo spazio come delimitatore dei campi, secondo me piu’ utile, altrimenti viene usato il carattere tab. Il campo -f indica il numero o il range (es. 2-3) dei campi da estrarre.
Altrimenti si puo’ usare un micro script awk
awk ‘{print $2}’ nome_file
.
In questo caso non e’ possibile indicare un range di campi, ma solo una lista. Di contro, awk riconosce come delimitatore sia gli spazi che le tabulazioni.