Question

J'ai un très long fichier que je veux imprimer mais en sautant les 1e6 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.

Était-ce utile?

La solution

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 & "; premier &"; 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 seulement voir le dernier nombre de lignes, omettez le " + ":

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

Autres conseils

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   "+", commence par le Kth du début de chaque fichier.

Ainsi, comme indiqué dans le commentaire, mettre +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 détaillée 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 ignorer les deux premières lignes
tail -n +3 <filename>

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

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

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

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

sed -n '20,30 p' myFile.txt

Utilisez la sed delete commande avec une 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 d’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

Résultat 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 correspondent aux attentes: -)

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

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

où num est 1e6 + le 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}'

Je devais faire la même chose et j'ai trouvé ce fil de discussion.

J'ai essayé & "; tail -n +, mais tout est imprimé.

Les lignes more + ont bien fonctionné à l’invite, mais il s’est avéré qu’elles se comportaient de manière totalement différente lorsqu’elles étaient exécutées en mode sans tête (cronjob).

J'ai finalement écrit moi-même:

skip=5
FILE="/tmp/filetoprint"
tail -n$((`cat "${FILE}" | wc -l` - skip)) "${FILE}"
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top