Comment classer le fractionnement à un numéro de ligne [fermé]

94

Je veux diviser un fichier journal de 400 000 lignes à partir d'un numéro de ligne particulier.

Pour cette question, faisons de ce nombre arbitraire 300k.

Existe-t-il une commande linux qui me permet de faire cela ( dans le script )?

Je sais que cela splitme permet de diviser le fichier en parties égales soit par taille ou par numéro de ligne, mais ce n'est pas ce que je veux. Je veux le premier 300k dans un fichier et le dernier 100k dans le deuxième fichier.

Toute aide serait appréciée. Merci!

À la réflexion, ce serait plus adapté au site superutilisateur ou au site Serverfault.

dénormaliseur
la source
16
Je pense que cette question est bien ici. Vous avez une tâche de programmation que vous essayez de résoudre avec un script shell; s'il s'agit d'un one-liner utilisant des outils Unix largement disponibles, tant mieux!
Jim Lewis
Je pensais la même chose. Mais là encore, je n'écrivais pas de script shell :) eh bien, j'ai quand même trouvé ma réponse. Merci
denormalizer
5
Cette question est très bien, sans aucun doute, c'est une question de programmation et elle n'est pas trop localisée non plus
Peter
9
pourquoi est-ce une question hors sujet? la police de la pensée est plus folle que jamais.
Karel Bílek
6
Bien que cette question puisse être un peu hors sujet, elle est hautement votée et est le premier résultat dans les moteurs de recherche avec de telles requêtes "linux split file at line". Ainsi, je suggérerais de rouvrir cette question, afin que d'autres réponses valables puissent être ajoutées. Ou au moins, faites un lien vers la question la plus pertinente sur SU.
Antoine Pinsard

Réponses:

178
file_name=test.log

# set first K lines:
K=1000

# line count (N): 
N=$(wc -l < $file_name)

# length of the bottom file:
L=$(( $N - $K ))

# create the top of file: 
head -n $K $file_name > top_$file_name

# create bottom of file: 
tail -n $L $file_name > bottom_$file_name

De plus, après réflexion, la division fonctionnera dans votre cas, car la première division est plus grande que la seconde. Split met la balance de l'entrée dans le dernier split, donc

split -l 300000 file_name

produira xaaavec 300k lignes et xabavec 100k lignes, pour une entrée avec 400k lignes.

académiqueRobot
la source
Merci. a trouvé une question à réponse similaire sur le superutilisateur ie. use tail etc Et, oui split fonctionnera avec mon exemple, mais mon exemple n'a pas toujours été 100K.
dénormaliseur
2
Si vous essayez de le faire sous Windows et que vous ne souhaitez pas utiliser Cygwin, ce projet fournit tous les utilitaires nécessaires sous forme de binaires win32 natifs - unxutils.sourceforge.net
Jonathon Hill
15
J'utiliserais tail -n +L file_name > bottom_fileoù simplement L=K+1sans avoir besoin de courir en wcpremier
Hashbrown
2
Je préfère utiliser sed -n '1,1000p' test.log > top_test.log ; sed '1,1000d' test.log > bottom_test.log. IHMO, c'est plus simple et ne nécessite pas de calculer le nombre total de lignes. De plus, cela fonctionne toujours si des lignes ont été ajoutées entre l'exécution de chaque commande.
Antoine Pinsard
Pour certains fichiers, cette réponse laisse une ligne, mais la modification suggérée par Hashbrown résout le problème.
scharette