Stampa il contenuto del file senza la prima e lultima riga

Esiste un modo semplice per echo un file, saltando la prima e lultima riga? Stavo guardando le tubazioni da head a tail, ma per quelli sembra che dovrei conoscere le linee totali dallinizio. Stavo anche cercando split, ma non vedo un modo per farlo neanche con quello.

Risposta

Solo con sed, senza pipe:

sed "1d;$d" file.txt 

NOTA

  • 1 significa prima linea
  • d mean delete
  • ; è il separatore per 2 comandi
  • $ mean ultima riga

Risposta

Non è necessario conoscere il numero di righe in anticipo. tail e head possono prendere rispettivamente un offset dallinizio o dalla fine del file.

Questo pipe inizia da la seconda riga del file (saltando la prima riga) e si ferma alla penultima (saltando lultima riga). Per saltare più di una riga allinizio o alla fine, modifica i numeri di conseguenza.

tail -n +2 file.txt | head -n -1 

viceversa, ovviamente funziona allo stesso modo:

head -n -1 file.txt | tail -n +2 

Commenti

  • Non ' t so perché, ma head -n -1 rimuove la prima E lultima riga del mio file .txt, su Ubuntu 14.04.2LTS.
  • Su MacOS head -n -1 dice che head: illegal line count -- -1
  • head -n -1 funziona con GNU coreutils, forse MacOS ha qualche variante BSD?

Risposta

Ecco come farlo con awk:

awk "NR>2 {print t} {t=$0}" 

Anche un altro modo per sed:

sed "1d;x" file.txt 

x è il comando sed avanzato, cambia la riga corrente con il precedente: la corrente va nel buffer e prece- dente s va sullo schermo e così via mentre sed elabora lo stream riga per riga (questo è il motivo per cui la prima riga sarà vuota).

awk soluzione su ogni passaggio (riga) inserisce la riga corrente nella variabile e inizia a stamparla solo dopo che la seconda riga è passata. Quindi, abbiamo ottenuto una sequenza di righe di merda sullo schermo dalla penultima allultima ma una. Lultima riga è omessa perché la riga è nella variabile e dovrebbe essere stampata solo nel passaggio successivo, ma tutti i passaggi sono già terminati e non vediamo mai la riga sullo schermo.

Stessa idea nel perl:

 perl -ne "print $t if $.>2 ; $t=$_" file.txt  

$. sta per numero di riga e $_ per riga corrente.
perl -n è una scorciatoia per while(<..>) {..} struttura e -e è per lo script inline.

Risposta

Per utenti Mac:

Su Mac, head -n -1 non funziona. Invece, inverti il file, taglia la prima riga, quindi invertila indietro:

tail -r file.txt | tail -n +2 | tail -r 

Spiegazione:

  1. tail -r: inverte lordine delle righe nel suo input

  2. tail -n +2: stampa tutte le l ines a partire dalla seconda riga nel suo input

Commenti

  • Fallirebbe con head: illegal line count -- -1 per essere esatti.

Risposta

In Python vorrei fare così.

#!/usr/bin/python3 import re import sys file = sys.argv[1] with open(file, "r") as f: L = [] for line in f: line = re.sub(r"\n", r"", line) L.append(line) print("\n".join(L[1:-1])) 

Incolla il codice precedente in un file e chiamalo script.py. Esegui lo script sul file che desideri controllare.

python3 script.py /path/to/the/file 

Esempio:

$ cat file foo apple banana bar $ python3 script.py file apple banana 

Commenti

  • ''.join(list(open("/path/to/file"))[1:-1]): questa sembra essere una soluzione più semplice 🙂 E se hai bisogno che venga eseguita direttamente dal prompt dei comandi, potresti provare: python -c 'print("".join(list(open("/path/to/file"))[1:-1]))'

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *