Come rimuovere le righe superiore e inferiore da un file usando sed, awk, ecc. in 1 passo

1

Voglio tagliare le prime 13 e le ultime 6 righe da un file

Ci sono diverse risposte su unix / linux ma non funzionano per me poiché le opzioni sed usate non sono disponibili su osx, tac non è disponibile, ecc.
Si sto postando qui per un q & a che è specifico per osx

In questo momento sto usando

$ cat myfile | tail -n+14 | sed '$d' | sed '$d' | sed '$d' | sed '$d' | sed '$d' | sed '$d'

ma sto cercando un "passo 1 alla fine" più corto.

    
posta Michael Durrant 18.08.2015 - 12:31
fonte

5 risposte

1

Prova in questo modo:

sed '1,13d' filename | head -n -6

Il comando sed può essere usato per cancellare un intervallo di linee. Qui 1 e 13 sono numeri di linea min e max.

    
risposta data 18.08.2015 - 13:29
fonte
1

Solo per il gusto di farlo:

sed -e '1,13d' -e $(($(wc -l <FILE)-6+1)),\$d FILE

Hai comunque bisogno di due passaggi completi sul file di input.

    
risposta data 29.09.2015 - 17:21
fonte
1

Puoi fare tutto con tail

tail -n+14 FILE | tail -r | tail -n+7 | tail -r
  • Il primo tail rimuove le 13 linee principali
  • Il secondo tail inverte l'ordine delle righe
  • Il terzo tail rimuove le prime 6 righe dell'ordine inverso
  • L'ultima tail inverte nuovamente l'ordine di linea

o con awk (con ispirazione da patrix)

awk -v n="$(wc -l FILE)" 'NR > 13 && NR < (n-6+1)' FILE
    
risposta data 18.08.2015 - 13:22
fonte
0

Ecco la mia prova, non è così elegante ma funziona:

cat myFile | tail -n+14 | head -n $[ $(wc -l myFile | awk '{ print $1 }') - 19 ]

Nota: l'ultimo 19 è 13 + 6

È meglio incorporare questo in uno script:

#!/bin/bash                                                                                                                                                                                                        

FILE="$1"
HEAD_STRIP="$2"
TAIL_STRIP="$3"

cat $FILE | tail -n+$[$HEAD_STRIP + 1] | head -n $[ $(wc -l $FILE | awk '{ print $1 }') - $[HEAD_STRIP + TAIL_STRIP] ]
    
risposta data 18.08.2015 - 13:13
fonte
0

Funzionerà con la versione di OSX di tail :

cat file.txt | tail -n +7 | tail -r | tail -n +14 | tail -r    

Se hai la versione gnu di head (installato da: brew install coreutils ) puoi fare:

cat file.txt | tail -n +7 | head -n -13
    
risposta data 29.09.2015 - 15:02
fonte

Leggi altre domande sui tag