Argomenti negativi su testa / coda


14

Varianti di questa domanda sono state sicuramente poste più volte in luoghi diversi, ma sto tentando di rimuovere le ultime Mrighe da un file senza fortuna.

La seconda risposta più votata in questa domanda raccomanda di fare quanto segue per sbarazzarsi dell'ultima riga in un file:

head -n -1 foo.txt > temp.txt

Tuttavia, quando lo provo in OSX e Zsh, ottengo:

head: illegal line count -- -1

Perché? Come posso rimuovere le M ultime righe e le prime N righe di un determinato file?



1
Qual è l'output di head --version? Quale sistema stai usando?
jofel

@jofel head --versionrestituisce effettivamente un errore.
Amelio Vazquez-Reina,

Risposte:


20

Puoi rimuovere le prime 12 righe con:

tail -n +13

(Ciò significa stampare dalla tredicesima riga.)

Alcune implementazioni di supporto headGNU simile head:

head -n -12

ma non è standard.

tail -r file | tail -n +12 | tail -r

funzionerebbe su quei sistemi che hanno tail -r(vedi anche GNU tac) ma non è ottimale.

Dov'è n1:

sed '$d' file

Puoi anche fare:

sed '$d' file | sed '$d'

per rimuovere 2 righe, ma non è ottimale.

Tu puoi fare:

sed -ne :1  -e 'N;1,12b1' -e 'P;D'

Ma attenzione che non funzionerà con grandi valori di n con alcune sedimplementazioni.

Con awk:

awk -v n=12 'NR>n{print line[NR%n]};{line[NR%n]=$0}'

Per rimuovere le mrighe dall'inizio e ndalla fine:

awk -v m=6 -v n=12 'NR<=m{next};NR>n+m{print line[NR%n]};{line[NR%n]=$0}'

sed 'x;1d;$d'potrebbe essere usato anche per ottenere le ultime due righe. E un paio di volte Ndopo 1dpotrebbero essere usati per ottenere qualcosa in più, anche se a quel punto non offre alcun vantaggio rispetto al N;P;Dciclo che già consigli.
Mikeserv,

Grazie - L'ultimo comando è estremamente utile. Un piccolo avvertimento estivo: non funziona quando mo lo nsono 0. Altrimenti sarebbe perfetto.
Amelio Vazquez-Reina,

2

È possibile utilizzare il seguente modo per rimuovere le prime N linee e le ultime M linee.

Con N=5, M=7e il file test.txt:

sed -n -e "6,$(($(wc -l < test.txt) - 7))p" test.txt

Il comando stampa tutte le righe da N + 1 a LastLine-M.

Un'altra opzione è usare Python:

python -c 'import sys;print "".join(sys.stdin.readlines()[5:-7]),' < test.txt

1

Puoi rimuovere le ultime M(qui M = 100) righe da un file con:

head -$(($(wc -l < foo.txt) - 100)) foo.txt > temp.txt
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.