web-dev-qa-db-fra.com

Fractionner un fichier en deux

J'ai un gros fichier et je dois le diviser en deux fichiers. Supposons que dans le premier fichier, les 1000 lignes doivent être sélectionnées et placées dans un autre fichier et supprimez ces lignes dans le premier fichier.

J'ai essayé d'utiliser split mais cela crée plusieurs morceaux.

23
Aravind

La façon la plus simple est probablement d'utiliser head et tail:

$ head -n 1000 input-file > output1
$ tail -n +1001 input-file > output2

Cela mettra les 1000 premières lignes de input-file en output1, et toutes les lignes de 1001 jusqu'à la fin dans output2

36
Michael Mrozek

Je pense que split est votre meilleure approche.

Essayez d'utiliser le -l xxxx option, où xxxx est le nombre de lignes que vous souhaitez dans chaque fichier (la valeur par défaut est 1000).

Vous pouvez utiliser le -n yy option si vous êtes plus préoccupé par la quantité de fichiers créés. Utilisation -n 2 divisera votre fichier en seulement 2 parties, quelle que soit la quantité de lignes dans chaque fichier.

Vous pouvez compter le nombre de lignes de votre fichier avec wc -l filename. Il s'agit de la commande 'wordcount' avec l'option lignes.

Références

  • man split
  • man wc
16
Lucien Raven

Ceci est un travail pour csplit :

csplit -s infile 1001 

s divisera de manière illimitée infile, la première pièce xx00 - jusqu'à mais sans inclure la ligne 1001 et la deuxième pièce xx01 - les lignes restantes.
Vous pouvez jouer avec les options si vous avez besoin de noms de fichiers de sortie différents, par ex. en utilisant -f et en spécifiant un préfixe :

csplit -sf piece. infile 1001 

produit deux fichiers nommés piece.00 et piece.01


Avec un head intelligent, vous pouvez également faire quelque chose comme:

{ head -n 1000 > 1st.out; cat > 2nd.out; } < infile
10
don_crissti

Un moyen simple de faire ce que la question demande, en une seule commande:

awk '{ if (NR <= 1000) print > "piece1"; else print > "piece2"; }' bigfile

ou, pour ceux d'entre vous qui détestent vraiment taper de longues commandes intuitivement compréhensibles,

awk '{ print > ((NR <= 1000) ? "piece1" : "piece2"); }' bigfile