web-dev-qa-db-fra.com

Imprimer un fichier en sautant les premières X lignes dans Bash

J'ai un très long fichier que je veux imprimer mais en sautant les 1e 6 premières lignes par exemple. Je regarde la page de manuel de chat mais je ne voyais aucune option pour le faire. Je cherche une commande pour faire ceci ou un programme bash simple.

477
Eduardo

Vous aurez besoin de queue. Quelques exemples:

$ tail great-big-file.log
< Last 10 lines of great-big-file.log >

Si vous avez vraiment besoin de PASSER un nombre particulier de "premières" lignes, utilisez

$ tail -n +<N+1> <filename>
< filename, excluding first N lines. >

Autrement dit, si vous souhaitez ignorer N lignes, vous commencez à imprimer la ligne N + 1. Exemple:

$ tail -n +11 /tmp/myfile
< /tmp/myfile, starting at line 11, or skipping the first 10 lines. >

Si vous voulez juste voir le dernier nombre de lignes, omettez le "+":

$ tail -n <N> <filename>
< last N lines of file. >

Si vous avez GNU tail disponible sur votre système, vous pouvez procéder comme suit:

tail -n +1000001 huge-file.log

C'est le + caractère qui fait ce que vous voulez. Pour citer la page de manuel:

Si le premier caractère de K (le nombre d'octets ou de lignes) est un "+", imprimez en commençant par l'élément Kth à partir du début de chaque fichier.

Ainsi, comme indiqué dans le commentaire, la saisie de +1000001 commence à imprimer avec le premier élément après les 1 000 000 premières lignes.

92
Eddie

Le moyen le plus simple que j'ai trouvé pour supprimer les dix premières lignes d'un fichier:

$ sed 1,10d file.txt
90
David Parks

Une version moins verbeuse avec AWK:

awk 'NR > 1e6' myfile.txt

Mais je recommanderais d'utiliser des nombres entiers.

25
newtover

Juste pour proposer une sed alternative. :) Pour sauter le premier million de lignes, essayez |sed '1,1000000d'.

Exemple:

$ Perl -wle 'print for (1..1_000_005)'|sed '1,1000000d'
1000001
1000002
1000003
1000004
1000005
13
tuomassalo

si vous voulez sauter les deux premières lignes
tail -n +3 <filename>

si vous voulez sauter la première ligne x
tail -n +$((x+1)) <filename>

13
saipraneeth

Si vous voulez voir les 10 premières lignes, vous pouvez utiliser sed comme ci-dessous:

sed -n '1,10 p' myFile.txt

ou si vous voulez voir les lignes 20 à 30, vous pouvez utiliser:

sed -n '20,30 p' myFile.txt
13
Kadir YILDIZ

Utilisez la commande sed delete avec un adresse de plage . Par exemple:

$ sed 1,100d file.txt # Print file.txt omitting lines 1-100.

Si vous souhaitez uniquement imprimer une plage connue, utilisez la commande print avec l'indicateur -n:

$ sed -n 201,300p file.txt # Print lines 201-300 from file.txt

Cette solution devrait fonctionner de manière fiable sur tous les systèmes UNIX, indépendamment de la présence des utilitaires GNU.

12
maerics

Ce script Shell fonctionne bien pour moi:

#!/bin/bash
awk -v initial_line=$1 -v end_line=$2 '{
    if (NR >= initial_line && NR <= end_line) 
    print $0
}' $3

Utilisé avec cet exemple de fichier (fichier.txt):

one
two
three
four
five
six

La commande (elle extraira de la deuxième à la quatrième ligne du fichier):

edu@debian5:~$./script.sh 2 4 file.txt

Sortie de cette commande:

two
three
four

Bien sûr, vous pouvez l’améliorer, par exemple en vérifiant que toutes les valeurs d’argument sont celles attendues :-)

10
sourcerebels

Vous pouvez le faire en utilisant les commandes head et tail:

head -n <num> | tail -n <lines to print>

où nombre est égal à 1e6 + nombre de lignes à imprimer.

6
Dana the Sane
sed -n '1d;p'

cette commande supprimera la première ligne et imprimera le reste

5
cat < File > | awk '{if(NR > 6) print $0}'
3
aamadeo