web-dev-qa-db-fra.com

Comment obtenir des lignes 10 à 100 d'un fichier de 200 lignes dans un nouveau fichier

J'ai un fichier de 200 lignes.

J'ai besoin d'extraire des lignes de 10 à 100 et de les mettre dans un nouveau fichier.

Comment faites-vous cela sous unix/Linux?

Quelles sont les commandes possibles que vous pourriez utiliser?

22
sunil

Utilisez sed :

sed -n -e '10,100p' input.txt > output.txt

sed -n signifie ne pas imprimer chaque ligne par défaut. -e signifie exécuter l'argument suivant en tant que script sed. 10,100p est un script sed qui signifie commencer à la ligne 10, jusqu'à la ligne 100 (incluse), imprimer (p) cette ligne. Ensuite, la sortie est enregistrée dans output.txt.

Si votre fichier est plus long que suggéré, cette version (suggérée dans les commentaires) sera plus rapide:

sed -e '1,9d;100q'

Cela signifie que supprimer les lignes 1-9, quitter après la ligne 100, et imprimer le reste. Pour 200 lignes, cela n'aura pas d'importance, mais pour 200 000 lignes, la première version examinera toujours chaque ligne même lorsqu'elle ne sera jamais imprimée. Je préfère la première version en général pour être explicite, mais avec un long fichier, ce sera beaucoup plus rapide - vous connaissez mieux vos données.

Alternativement, vous pouvez utiliser head et tail en combinaison:

tail -n +10 input.txt | head -n 91 > output.txt

Cette fois, tail -n +10 imprime l'intégralité du fichier à partir de la ligne 10 et head -n 91 imprime les 91 premières lignes de celui-ci (jusqu'à la ligne 100 incluse du fichier d'origine). Il est redirigé vers output.txt de la même manière.

41
Michael Homer

Si vous deviez le faire dans vim, ce serait assez simple. Supposons que votre fichier soit nommé src et que le fichier vers lequel vous souhaitez déplacer les lignes soit dest. Si dest n'existe pas déjà, vous le créeriez:

touch dest

Ensuite, ouvrez à la fois src et dest dans vim (le -p flag ouvre les arguments dans les onglets):

vim -p src dest

Sautez à la dixième ligne; tout sélectionner de la 10e ligne à la 100e ligne; coup sec; passer à l'onglet contenant dest; pâte.

10ggv101ygtp

Remarque: le 101 sélectionne au début de la 101e ligne (capture le \n à la fin de la ligne 100).


C'est évidemment un processus un peu plus compliqué que d'utiliser un outil en ligne de commande, mais a l'avantage de vous donner une sélection visuelle (afin que vous puissiez être sûr d'obtenir tout ce que vous voulez). Cependant, cela semble également être un bon cas d'utilisation pour awk:

awk 'NR==10, NR==100' src > dest

La variable NR vous permet de faire correspondre des motifs au nombre de lignes. Ainsi, la commande ci-dessus extrait les lignes 10 à 100 de src, puis votre Shell redirige la sortie vers dest.

7
HalosGhost

Cela devrait faire

tail -n +10 file.txt | head -n 91 > newfile.txt

6
Creek

Vous pouvez le faire de plusieurs façons.

Une solution awk:

$ awk 'NR<10{next};1;NR>100{exit}' file > new_file

Une solution Perl:

$ Perl -nle '
    print if $. > 9 and $. < 101;
    exit if $. > 100;
' file > new_file
3
cuonglm