Fractionner un fichier en deux

18

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 splitmais cela crée plusieurs morceaux.

Aravind
la source
Avez-vous vérifié split --help?
Braiam
Oui, je l'ai vérifié, mais je crée plusieurs fichiers qui n'ont pas besoin de moi.
Aravind

Réponses:

30

Le moyen le plus simple est probablement d'utiliser headet tail:

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

Cela mettra les 1000 premières lignes de input-fileen output1, et toutes les lignes de 1001 jusqu'à la fin enoutput2

Michael Mrozek
la source
13

Je pense que splitc'est votre meilleure approche.

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

Vous pouvez utiliser l' -n yyoption si vous êtes plus préoccupé par la quantité de fichiers créés. L'utilisation -n 2divisera 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.

Les références

  • man split
  • man wc
Lucien Raven
la source
1
Voici comment diviser en un groupe de fichiers avec un nombre fixe de lignes, ou comment diviser uniformément en un nombre fixe de fichiers. Existe-t-il un moyen de diviser en un fichier de 1000 lignes et un fichier avec tout le reste? C'est ce qu'il demandait; Je ne le trouvais pas dans la page de manuel
Michael Mrozek
Tu as raison Michael. Je pense avoir adopté une vision simpliste de la question. Votre solution est la meilleure dans ce cas. Une autre façon serait d'utiliser la commande 'sed': sed -n 1,1000 originalfile> first_1000_lines. sed '1,1000d' originalfile> Ligne_résistante.
Lucien Raven
Bien sûr, vous pourriez le faire split -l 1000 bigfile && mv xaa piece1 && cat x?? > piece2 && rm x??.
G-Man dit `` Réintègre Monica ''
8

C'est un travail pour csplit:

csplit -s infile 1001 

sera silently divisé infile, la première pièce xx00- jusqu'à , mais non y compris la ligne 1001 et la seconde 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 exemple en utilisant -fet en spécifiant un préfixe :

csplit -sf piece. infile 1001 

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


Avec une puce, headvous pouvez également faire quelque chose comme:

{ head -n 1000 > 1st.out; cat > 2nd.out; } < infile
don_crissti
la source
1
Wow, vraiment est un travail pour csplit. Très agréable. (Je suis en train de lire la liste des commandes POSIX et j'ai eu énormément de mal csplità comprendre la raison d'être de la commande au début. Il s'avère que c'est vraiment très simple.) :)
Wildcard
4

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
G-Man dit «Réintègre Monica»
la source