88 votes

Comment conserver uniquement la nième ligne d'un fichier ?

J'ai un fichier CSV assez volumineux (75MB). J'essaie juste d'en faire un graphique, donc je n'ai pas vraiment besoin de toutes les données.

Reformulation : Je voudrais supprimer n lignes, puis garder une ligne, puis supprimer n lignes, et ainsi de suite.

Donc si le fichier ressemble à ça :

Line 1
Line 2
Line 3
Line 4
Line 5
Line 6

et n=2, alors la sortie serait :

Line 3
Line 6

Il semble que sed pourrait être en mesure de le faire, mais je n'ai pas réussi à trouver comment. Une commande bash serait idéale, mais je suis ouvert à toute solution.

1voto

DomTomCat Points 111

Une version de Python (aussi bien Python 2 que Python 3) :

python2 -c "print(''.join(open('file.txt').readlines()[::3]))"

remplacer [::3] avec des paramètres de début, de fin et de taille de pas pour un meilleur contrôle. Par exemple [10:36:5] sort les lignes 10,15,...,35.

Remarque, puisque readlines() conserve les fins de ligne, la sortie de cet appel peut se terminer par une dernière ligne vide, à moins que la dernière ligne originale ne soit supprimée par la taille de pas choisie.

Une version stream est également possible (ici, la sortie ne se fait qu'une fois le stream terminé) :

python -c "import sys;print(''.join(list(sys.stdin)[::3]))" < file.txt

1voto

Caesar Points 156

GNU coreutils split peut faire cela, par exemple :

seq 100 | split -n r/3/3

Explication : split -n r/i/n prendra chaque ligne k (en comptant à partir de 0) où (k % n) + 1 = i .

S'il s'agit d'un fichier CSV et que vous devez conserver l'en-tête, split -n r/1/3 fera l'affaire.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X