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?
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.
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
.
Cela devrait faire
tail -n +10 file.txt | head -n 91 > newfile.txt
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