Come cancello le prime n righe di un file ASCII usando i comandi di shell?


93

Ho più file che contengono informazioni di testo ASCII nelle prime 5-10 righe, seguite da informazioni di matrice ben tabulate. In uno script di shell, desidero rimuovere queste prime righe di testo in modo da poter utilizzare le informazioni di matrice pura in un altro programma. Come posso usare i comandi della shell bash per fare questo?

Se è di aiuto, sto usando RedHat e un sistema Ubuntu Linux.

Risposte:


144

Finché il file non è un collegamento simbolico o hardlink, è possibile utilizzare sed, tail o awk. Esempio sotto.

$ cat t.txt
12
34
56
78
90

sed

$ sed -e '1,3d' < t.txt
78
90

È inoltre possibile utilizzare sed sul posto senza un file temporaneo: sed -i -e 1,3d yourfile. Ciò non farà eco, modificherà semplicemente il file sul posto. Se non è necessario reindirizzare il risultato a un altro comando, questo è più semplice.

coda

$ tail -n +4 t.txt
78
90

awk

$ awk 'NR > 3 { print }' < t.txt
78
90

8
È inoltre possibile utilizzare sed sul posto senza un file temporaneo: sed -i -e 1,3d yourfile. Ciò non farà eco, modificherà semplicemente il file sul posto. Se non è necessario reindirizzare il risultato a un altro comando, questo è più semplice.
Yanick Girouard,

1
Grazie @YanickGirouard, @IgnacioVazquezAbrams! Voi due mi avete appena risparmiato un sacco di lavoro manuale nella mia ricerca! :)
Paul,

2
@Svetlana in sed -iparticolare. La maggior parte delle implementazioni elimina semplicemente il file e lo sostituisce con uno nuovo, che non funziona per i collegamenti poiché si finisce per lasciare l'originale nella sua altra posizione.
jw013,

6
che ne dici di spiegare cosa "1,3d", +4, ecc. si intende? La domanda era per n righe, ma non hai detto che cosa è n (come apparentemente n è 2 nei tuoi esempi, anche se non è ovvio per un noob cosa cambiare per cambiare n)
Robin Manoli

3
Questo utilizza un file temporaneo, quindi non molto utile per uno spazio su disco di utilità del 100%. Sarebbe interessante avere una soluzione che faccia letteralmente "sul posto".
Shai,

10

sed -i '1,3d' file.txt

Questo elimina le prime 3 righe da file.txt.


6

Se le righe tabulate sono quelle che hanno un carattere tab:

grep '␉' <input_file >output_file

( essendo un carattere di tabulazione letterale) o equivalentemente

sed -n '/␉/p' <input_file >output_file

In uno script bash / ksh / zsh, puoi scrivere $'\t'per una scheda, ad esempio grep $'\t'o sed -n $'/\t/p'.

Se si desidera eliminare 10 righe all'inizio del file:

tail -n +11 <input_file >output_file

(nota che è +11per eliminare 10 righe, perché +11significa "inizia dalla riga 11" e le righe dei numeri di coda da 1) o

sed '1,10d' <input_file >output_file

Su Linux, puoi sfruttare l' -iopzione di GNU sed per modificare i file in atto:

sed -i -n '/\t/p' *.txt

Oppure puoi usare un loop di shell e file temporanei:

for x in *.txt; do
  tail -n +11 <"$x" >"$x.tmp"
  mv "$x.tmp" "$x"
done

O se non vuoi modificare i file in atto, ma invece dai loro un nome diverso:

for x in *.txt; do
  tail -n +11 <"$x" >"${x%.txt}.data"
done

3
"tabulato" di solito significa "piuttosto stampato in una tabella", non "rientrato con caratteri di tabulazione".
Ignacio Vazquez-Abrams,

@ IgnacioVazquez-Abrams Lo so. La tabella piuttosto stampata a volte utilizza caratteri di tabulazione, che è più facile da individuare rispetto alle colonne allineate. Naturalmente, se Paul fornisse un input di esempio, potrei dare un matcher migliore.
Gilles,

2

Puoi usare Vim in modalità Ex:

ex -sc '1d5|x' file
  1. 1 passa alla prima riga

  2. 5 seleziona 5 righe

  3. d Elimina

  4. x salva e chiudi


0

echo "a \ nb" | sed '1d' # cancella la prima riga

cat list.txt | sed '1d'> list.csv # leggi list.txt e scrivi list.csv senza la prima riga

Altri comandi utili:

grep '^ |' # trova il primo carattere (pipe |)

sed 's / | // g' # elimina pipe

sed 's / // g' # cancella lo spazio


0

In percentuale

Utilizzo bash, per ripulire un file utilizzando un numero percentuale anziché un numero assoluto di righe:

sed -i -e 1,$( printf  "$((`cat php_errors.log | wc -l` * 75 /100 ))" )d php_errors.log

Fai attenzione perché quel comando può essere distruttivo poiché elimina il contenuto sul posto, senza crearne una copia.

Elimina il primo 75% di righe dal file menzionato.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.