lire la plage spécifiée de lignes d'un fichier

15

J'ai un fichier qui contient 100000 lignes comment obtenir les lignes de la ligne # 5555 à la ligne # 7777 sous Linux.

Merci pour tout.


la source
1
@ibrahim, envisagez d'accepter la réponse de Kyle (en cochant la coche verte à gauche) si cela vous a aidé
Jonik
vous pouvez préciser si vous souhaitez utiliser sed ou si d'autres outils sont OK.
Manu H
Un peu de recherche jette au moins stackoverflow.com/questions/83329/…
sancho.s Réintègre Monica

Réponses:

22
sed '5555,7777!d' <filename>

Cela imprimera les lignes 5555-7777 du fichier inclusivement.

Dennis a posté ce qui suit, je pense qu'il devrait être plus rapide:

sed '5555,7777p; 7778q' filename

La preuve suivante qu'il devrait être plus rapide:

$ n=1
$ while [[ n -le 100000 ]]; do echo $n >> sedtest2; n=$((n + 1)); done
$ strace -e trace=read -o sed1 sed '5555,7777!d' sedtest2
$ strace -e trace=read -o sed2 sed '5555,7777p; 7778q' sedtest2
$ wc -l sed1
149 sed1
$ wc -l sed2
14 sed1

Dans Bash uniquement (pour le plaisir):

n=1
while read line; do 
    if [[ ($n -ge 5555) && ($n -le 7777)  ]]; then 
        echo $line
    elif [[ $n -gt 7777 ]]; then
        break
    fi 
    n=$(( $n + 1 ))
done < file
Kyle Brandt
la source
Je pense que votre $n -gt 37777 devrait être? En outre, vous pouvez le faire if (( n >= 5555 ))pour des opérateurs de comparaison numériques plus «naturels» (et la possibilité de laisser de côté le signe dollar). Et vous pouvez le faire ((n++)).
pause jusqu'à nouvel ordre.
16

Arrêter de fumer lorsque vous avez terminé peut accélérer les choses:

sed -n '5555,7777p; 7778q' input_file
En pause jusqu'à nouvel ordre.
la source
1
+1, devrait être plus rapide, a mis à jour mon message pour montrer pourquoi.
Kyle Brandt
7

L'un ou l'autre devrait fonctionner;

  • sed -n ' startnumber , endnumber p'
  • awk 'NR> = startnumber && NR <= endnumber ' file

Grande question d'ailleurs;)

Chopper3
la source
1

J'ai trouvé que l'option sed ne fonctionnait pas sur un fichier mysqldump, je suppose en raison de la gestion des sauts de ligne entre guillemets ou des caractères multi-octets. la tête et la queue le coupent en utilisant les mêmes numéros de ligne que grep, ce dont j'avais besoin. Pour obtenir les lignes $ j à $ k, vous avez besoin de:

x=$(( $k - $j + 1 ))
tail -n +$j filename | head -${x} 
Dave Crooke
la source