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.
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.
Le moyen le plus simple que j'ai trouvé pour supprimer les dix premières lignes d'un fichier:
$ sed 1,10d file.txt
Une version moins verbeuse avec AWK:
awk 'NR > 1e6' myfile.txt
Mais je recommanderais d'utiliser des nombres entiers.
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
si vous voulez sauter les deux premières lignestail -n +3 <filename>
si vous voulez sauter la première ligne xtail -n +$((x+1)) <filename>
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
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.
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 :-)
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.
sed -n '1d;p'
cette commande supprimera la première ligne et imprimera le reste
cat < File > | awk '{if(NR > 6) print $0}'