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.

143voto

Selman Ulug Points 1556
~ $ awk 'NR == 1 || NR % 3 == 0' yourfile
Line 1
Line 3
Line 6

NR (nombre d'enregistrements) est le nombre de lignes d'enregistrement, car le comportement par défaut est une nouvelle ligne pour chaque enregistrement. RS (séparateur d'enregistrement). Le motif et l'action sont facultatifs dans le format par défaut de l'awk. 'pattern {actions}' . quand nous donnons seulement la partie du modèle alors awk écrit tous les champs $0 pour notre modèle true conditions.

63voto

kev Points 11612

sed peut également le faire :

$ sed -n '1p;0~3p' input.txt
Line 1
Line 3
Line 6

man sed explique ~ comme :

première~étape Correspond à chaque étape de la ligne en commençant par la première ligne. Par exemple, "sed -n 1~2p" imprimera toutes les lignes impaires du flux d'entrée, et l'adresse 2~5 correspondra à chaque cinquième ligne en commençant par la deuxième. L'adresse 2~5 correspondra à chaque cinquième ligne, en commençant par la deuxième. first peut être zéro ; dans ce cas, sed fonctionne comme s'il était égal à step. (Il s'agit d'une extension).

24voto

Ilmari Karonen Points 1609

Perl peut aussi le faire :

while (<>) {
    print  if $. % 3 == 1;
}

Ce programme va imprimer la première ligne de son entrée, et toutes les trois lignes suivantes.

Pour l'expliquer un peu, <> est l'opérateur d'entrée de ligne, qui itère sur les lignes d'entrée lorsqu'il est utilisé dans une commande while boucle comme celle-ci. La variable spéciale $. contient le nombre de lignes lues jusqu'à présent, et % est l'opérateur de modulation.

Ce code peut être écrit de manière encore plus compacte, en une seule ligne, en utilisant la fonction -n y -e interrupteurs :

perl -ne 'print if $. % 3 == 1'  < input.txt  > output.txt

El -e prend un morceau de code Perl à exécuter en tant que paramètre de ligne de commande, tandis que le commutateur -n englobe implicitement le code dans une balise while boucle comme celle présentée ci-dessus.


Edit : Pour obtenir les lignes 1, 3, 6, 9, ... comme dans l'exemple, plutôt que les lignes 1, 4, 7, 10, ... comme je pensais que vous le vouliez, remplacez $. % 3 == 1 avec $. == 1 or $. % 3 == 0 .

7voto

Amarok Points 310

Si vous voulez le faire avec un Bash script que vous pouvez essayer :

#!/bin/sh

echo Please enter the file name
read fname
echo Please enter the Nth lines that you want to keep
read n

exec<$fname
value=0
while read line
do
    if [ $(( $value % $n )) -eq 0 ] ; then
        echo -e "$line" >> new_file.txt
    fi
        let value=value+1 
done
echo "Check the 'new_file.txt' that has been created in this directory";

Enregistrez-le sous le nom de "read_lines.sh" et n'oubliez pas de donner les permissions +x au fichier bash.

chmod +x ./read_lines.sh

5voto

jfg956 Points 1129

Une solution en bash pur, qui ne génère pas de processus, est la suivante :

{ for f in {1..2}; do read line; done;
  while read line; do
    echo $line;
    for f in {1..2}; do read line; done;
  done; } < file

La première ligne saute 2 lignes au début du fichier, et le while imprimer la ligne suivante et sauter 2 lignes à nouveau.

Si votre fichier est petit, c'est un moyen très efficace d'effectuer le travail, car il ne lance pas de processus. Si votre fichier est volumineux, sed doit être utilisé car il est plus efficace pour gérer les entrées/sorties que le système bash .

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