Crea sito

Cancellare le ultime n-righe di un file

Vediamo un esempio del comando tac (il contrario di cat) che concatena il suo input e lo visualizza in output al contrario. Questa sua particolare funzione ci viene utile per eliminare le ultime n-righe di un file in quanto vengono visualizzate da subito in output ottenendo un notevole risparmio di tempo rispetto a una lettura completa di tutto il file.

[email protected]:~$ cat pippo.txt
1
2
3
4
5
6
7

Se voglio cancellare le ultime n-righe uso il comando tail +(n+1) su un file visualizzato al contrario e poi ri-visualizzato nuovamente al contrario in modo da riportarlo nel suo stato iniziale. Ad esempio se voglio eliminare le ultime 3 righe:

[email protected]:~$ tac pippo.txt | tail +4 | tac
1
2
3
4

Purtroppo, in alcune versioni del comando tail, l’opzione tail +n non è implementata ma solo la classica tail -n. Si può simulare lo stesso comportamento calcolando il numero di righe totali e sottraendo il numero desiderato anche se il wc obbliga a leggere interamente il file.

[email protected]:~$ tac pippo.txt  | tail -$(($(wc -l pippo.txt | awk '{print $1}')-3)) | tac
1
2
3
4

Se addirittura siete su un sistema Unix in cui non è presente il comando tac, come ad esempio Sun Solaris, allora bisogna leggere tutto il file e togliere la parte iniziale tramite head (e se il file è di dimensioni elevate allora tale sistema impiegherà parecchio tempo).

ALL=$(wc -l elenco.txt | awk '{print $1}')
TOP=$(($LAST - 3))
head -$(echo $TOP) elenco.txt > elenco.txt.new
mv elenco.txt.new elenco.txt

E’ possibile comunque simulare il comando tac tramite il sed.

[email protected]:~$ sed -n '1!G;h;$p' pippo.txt
7
6
5
4
3
2
1

Infine, sempre con il sed, è possibile cancellare direttamente l’ultima riga di un file; se tale comando lo eseguiamo in un ciclo otteniamo la cancellazione delle ultime n-righe.

[email protected]:~$ sed '$d' pippo.txt

Leave a Reply

Il tuo indirizzo email non sarà pubblicato.

*