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.
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
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.
man split
man wc
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
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