Stampa il contenuto del file senza la prima e l'ultima riga


54

Esiste un modo semplice per eseguire l'eco di un file, saltando la prima e l'ultima riga? Stavo guardando le tubazioni da headdentro tail, ma per quelle sembra che dovrei conoscere le linee totali dall'inizio. Stavo anche guardando split, ma non vedo nemmeno un modo per farlo.

Risposte:


97

Solo con sed, senza tubi:

sed '1d;$d' file.txt

NOTA

  • 1significa prima riga
  • dsignifica cancellare
  • ; è il separatore per 2 comandi
  • $significa l' ultima riga

36

Non è necessario conoscere in anticipo il numero di righe. taile headpuò prendere un offset rispettivamente dall'inizio o dalla fine del file.

Questa pipe inizia dalla seconda riga del file (salta la prima riga) e si ferma all'ultima ma una (salta la riga finale). Per saltare più di una riga all'inizio o alla fine, regolare i numeri di conseguenza.

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

facendo il contrario, funziona allo stesso modo, ovviamente:

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

Non so perché, ma head -n -1rimuove la prima E l'ultima riga del mio .txtfile, su Ubuntu 14.04.2LTS.
Sopalajo de Arrierez,

9

Ecco come farlo con awk:

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

Anche un altro modo per sed:

sed '1d;x' file.txt

xè un sedcomando avanzato , cambia la linea corrente con la precedente: la corrente va nel buffer e la precedente passa allo schermo e così via durante l' sedelaborazione del flusso riga per riga (ecco perché la prima riga sarà vuota).

awksoluzione su ogni passaggio (riga) inserisce la riga corrente nella variabile e inizia a stamparla solo dopo il passaggio della seconda riga. Quindi, abbiamo ottenuto una sequenza di linee merda sullo schermo dalla seconda all'ultima ma una. L'ultima riga viene omessa perché la riga si trova nella variabile e deve essere stampata solo nel passaggio successivo, ma tutti i passaggi sono già terminati e la riga non viene mai visualizzata sullo schermo.

Stessa idea in perl:

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

$.indica il numero di riga e la $_ riga corrente.
perl -nè una scorciatoia per la while(<..>) {..}struttura ed -eè per lo script in linea.


2

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 sopra in un file e chiamalo come script.py. Esegui lo script sul file con cui desideri verificare.

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

Esempio:

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

2

Per utenti Mac:

Su Mac, head -n -1non funziona. Invece, invertire il file, tagliare la prima riga, quindi invertire indietro:

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

Spiegazione:

  1. tail -r : inverte l'ordine delle linee nel suo input

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

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.