testa; testa
{ head -n[num] >/dev/null
head -n[num]
} <infile >outfile
Con quanto sopra è possibile specificare il primo numero di righe da rimuovere dalla testa dell'output con il primo head
comando e il numero di righe su cui scrivere outfile
con il secondo. In genere lo farà anche più velocemente di sed
- specialmente quando l'input è grande - nonostante richiedano due invocazioni. Dove sed
sicuramente dovrebbe essere preferito, tuttavia, è che non si<infile
tratta di un file normale e ricercabile , perché in genere non funzionerà come previsto in quel caso, ma può gestire tutte le modifiche di output in un singolo processo con script.sed
Con una GNU head
puoi usare anche il -
modulo negativo [num]
nel secondo comando. Nel qual caso il seguente comando eliminerà la prima e l'ultima riga dall'input:
{ head -n1 >/dev/null
head -n-1
} <infile >outfile
O con POSIX sed
:
Supponiamo, ad esempio, che stavo leggendo un input di 20 righe e che volessi rimuovere il primo 3 e l'ultimo 7. Se avessi deciso di farlo w / sed
, lo avrei fatto con un buffer di coda. Prima aggiungerei tre e sette per un conteggio totale delle strisce di dieci e poi farei:
seq 20 | sed -ne:n -e '3d;N;1,10bn' -eP\;D
Questo è un esempio che rimuove le prime 3 e le ultime 7 righe dall'input. L'idea è che è possibile eseguire il buffer di tutte le righe che si desidera rimuovere dalla coda dell'input nello spazio del motivo su una pila, ma P
stampare il primo di questi solo per ogni riga inserita.
- Sulle righe
1,10
sed
P
non stampa nulla perché per ognuna di esse è impilare l'input nello spazio del modello riga per riga in un b
ciclo ranch.
- Sulla terza riga
sed
viene d
eliminato tutto lo stack - e quindi le prime 3 righe vengono eliminate dall'output in un colpo solo.
- Quando
sed
raggiunge l' $
ultima riga di input e tenta di inserire l'estensione N
, colpisce EOF e interrompe l'elaborazione completamente. Ma a quel tempo lo spazio del modello contiene tutte le linee 14,20
- nessuna delle quali è stata ancora P
sfilacciata e mai lo è.
- Su ogni altra linea si
sed
P
limita solo fino alla prima \n
ewline che si verifica nello spazio del modello ed D
elimina la stessa prima di iniziare un nuovo ciclo con ciò che rimane - o le successive 6 linee di input. La settima riga viene nuovamente aggiunta allo stack con il N
comando ext nel nuovo ciclo.
E così, seq
dell'output (che è di 20 righe numerate in sequenza) , sed
stampa solo:
4
5
6
7
8
9
10
11
12
13
Ciò diventa problematico quando il numero di righe che si desidera eliminare dalla coda dell'input è elevato, poiché sed
le prestazioni sono direttamente proporzionali alla dimensione del suo spazio del modello. Tuttavia, in molti casi è una soluzione praticabile - e POSIX specifica uno sed
spazio modello per gestire almeno 4kb prima del busting.