Elimina l'ultima riga dal file


44

Uso sed per eliminare rapidamente le righe con una posizione specifica come

sed '1d'
sed '5d'

Ma cosa succede se voglio eliminare l'ultima riga del file e non conosco il conteggio delle righe (so che posso ottenerlo usando wce molti altri trucchi).

Attualmente, utilizzare una soluzione alternativa con heade tailcombinato con wcper farlo. Qualche colpo di scena qui?


Quale os? Alcuni sapori hanno opzioni interessanti per heade tail...
Nils

@Nils Sono su "Red Hat Enterprise Linux Server versione 5.5 (Tikanga)". Potete indicare le opzioni per heade tailconoscete sapori diversi?
mtk

L'ho fatto. Vedi sotto.
Nils,

Risposte:


88

in sed $è l'ultima riga quindi per eliminare l'ultima riga:

sed '$d' <file>

12
Utilizzare sed -i '$d' <file>per modificare il file in atto.
WanderingMind

1
Cosa sarebbe per eliminare le ultime n righe, dove n è un numero intero?
Joshua Salazar,

31

$ per l'ultima riga:

sed '$d' file

10
battere di 30 secondi: P
h3rrmiller

1
Purtroppo però si devono usare tecniche più complesse per cancellare, diciamo, le ultime due righe.
dubiousjim,

Cosa intendi? sed '$d' file; sed '$d' file
Rob,

3
@Rob: in sed '$d' filerealtà non modifica il file; stampa solo il contenuto del file, meno l'ultima riga. Quindi sed '$d' file; sed '$d' filestamperà il contenuto del file due volte , meno l'ultima riga ogni volta. L'equivalente di elimina le ultime due righe di sed '$d' fileè sed '$d' file | sed '$d'.
ruakh,

2
Sì, non è elegante ma ovviamente funziona. Lo farei in un passaggio con sed -n '1{h;n;}; $q; x; p;'. Stavo facendo il broncio che non possiamo semplicemente fare sed '$-1,$d'.
dubiousjim,

14

cat file.txt | head -n -1 > new_file.txt

Fai attenzione, sembra, a seconda dell'ultima riga di file.txt(se termina con EOF, oe \nquindi EOF), il numero di righe in new_file.txtpuò essere lo stesso (come file.txt) dopo questo comando (ciò accade quando non c'è \n) - in ogni caso, il contenuto dell'ultima riga viene eliminato.

Inoltre, si noti che è necessario utilizzare un secondo file (intermedio). Se esegui il cat e reindirizzi allo stesso file, lo cancellerai.


6
Dove funziona, potrebbe anche essere semplicemente head -n -1 file.txt > new_file.txt. Si noti tuttavia che i conteggi negativi head -nsono disponibili solo per alcune implementazioni di head. Ad esempio, non funziona per FreeBSD o per la versione di BusyBox di head.
dubiousjim,

1
@dubiousjim: D'accordo, head -n -1 file.txt > new_file.txtè meglio. Funziona allo stesso modo rispetto ai miei due commenti (stesso numero di righe e, cancella sullo stesso file). Per quanto riguarda l'argomento negativo, tali differenze si verificano di volta in volta tra gli Unix e sono spesso frustranti perché ti aspetti che sia lo stesso comando interamente (e perché non dovresti - stesso nome e scopo!) - comunque, buono punto. (Uso Debian.)
Emanuel Berg,

5

head --lines=-1. Mi sono imbattuto per la prima volta in questa possibilità nella pagina man per head su un sistema SLES11SP2 (coreutils-8.12-6.23.1)

taile headfanno parte di coreutils-rpm (almeno per i sistemi basati su rpm).

Secondo il log delle modifiche di coreutils, questa sintassi è supportata dalla versione 5.0.1 di coreutils

Cattive notizie: secondo la pagina man di RH5 questa opzione non è descritta

Buone notizie: funziona con RH5 (quindi nel tuo caso: funziona - almeno con una versione corrente di RH5).

rpm -q coreutils mi mostra (su CentOS 5.8): coreutils-5.97-34.el5_8.1

Non sono sicuro se RH5.5. ha già la versione coreutils che la supporta. Ma 5.5 ha EoLed comunque.


+1. funziona perfettamente su RH5.5. Grazie.
mtk,

0

Linux

$ è l'ultima riga, d per eliminare:

sed '$d' ~/path/to/your/file/name

Mac OS

Equivalente della sed -i

sed -i '' -e '$ d' ~/path/to/your/file/name
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.