Comment supprimer les lignes du haut et du bas d'un fichier en utilisant sed, awk, etc. en 1 étape

1

Je veux couper les 13 premières et les 6 dernières lignes d'un fichier

Il existe plusieurs réponses sur unix / linux mais elles ne fonctionnent pas car les options sed utilisées ne sont pas disponibles sur osx, tac n’est pas disponible, etc.
Si je poste ici pour un programme spécifique à osx

En ce moment j'utilise

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

mais je cherche un raccourci '1 pas à la fin'.

Michael Durrant
la source

Réponses:

1

Essayez de cette façon:

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

le sed Cette commande peut être utilisée pour supprimer une plage de lignes. Ici, 1 et 13 sont des numéros de ligne min et max.

jherran
la source
1

Juste pour le plaisir:

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

Il faut quand même deux passages complets sur le fichier d'entrée.

nohillside
la source
1

Vous pouvez tout faire avec tail

tail -n+14 FILE | tail -r | tail -n+7 | tail -r
  • La première tail supprime les 13 premières lignes
  • La deuxième tail inverse la commande en ligne
  • Le troisième tail supprime les 6 premières lignes de l'ordre inverse
  • Le dernier tail inverse l'ordre de la ligne à nouveau

ou avec awk (inspiré de patrix)

awk -v n="$(wc -l FILE)" 'NR > 13 && NR < (n-6+1)' FILE
fd0
la source
0

Voici mon essai, pas si élégant mais qui marche:

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

Note: dernier 19 est 13 + 6

Il est préférable de l'intégrer dans un 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] ]
Mateusz Szlosek
la source
0

Cela fonctionnera avec la version OSX de tail:

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

Si vous avez la version GNU de head (installé par: brew install coreutils ) tu peux faire:

cat file.txt | tail -n +7 | head -n -13
sente
la source
Outre le uuoc dans les deux commandes, vous avez les exigences à l'envers.
fd0