Comment diviser stdout pour accéder à plusieurs fichiers de sortie?


12

Dis, j'ai une commande commandqui imprime un grand nombre de lignes sur stdout:

line1
line2
.....
lineN

Je veux enregistrer la sortie sur le disque, mais pas en tant que fichier unique, mais en tant que séquence de fichiers ayant chacun 1000 lignes de sortie standard:

file0001.txt:
-------------
line1
....
line1000

file0002.txt:
-------------
line1001
....
line2000

etc

J'ai essayé de google la réponse, mais chaque fois que google me pointe vers la teecommande, ce qui est inutile dans cette situation. Probablement, je saisis des requêtes erronées.

Réponses:


24

Une fois que vous avez fini d'enregistrer le fichier, vous pouvez toujours splitle fichier en morceaux de fichier ou plusieurs fichiers en fonction du nombre de lignes.

split -l 1000 output_file

ou encore mieux, essayez

command | split -l 1000 -

Cela divisera le flux de sortie en fichiers avec chaque 1000 lignes (la valeur par défaut est de 1000 lignes sans l'option -l).

La commande ci-dessous vous donnera une flexibilité supplémentaire pour mettre ou appliquer un préfixe au nom de fichier qui sera généré lorsque la sortie sera générée et divisée pour être stockée dans le fichier.

command | split -l 1000 - small-


J'ai été confus, donc pour d'autres, son split [arguments...] [input e.g. "-" for stdin] [output_prefix], par exemple: tar -c somedir | split --byes 100MB --numeric-suffixes --suffix-length=3 - somedir.tar.part-produirait un tas de fichiers de 100 Mo nommés somedir.tar.part-000, 001, 002 ans, etc.
ThorSummoner

3

Vous pouvez utiliser un script bash lines.bash

#!/bin/bash
a=0
while IFS='' read -r line
do
  printf -v filename "%04d.txt" "$((a++/1000))"
  echo "$line" >> $filename
done

et l'utiliser comme:

cat long_file.txt | bash lines.bash

Le seul problème que j'ai remarqué est la *connexion long_file.txt(quelqu'un pourrait le corriger).


2
Définissez la IFSchaîne vide pour éviter la division des mots read. Utilisez -rpour désactiver l'échappement de la barre oblique inverse read. Supprimer -epour éviter que la barre oblique inverse ne s'échappe echo. Utilisez des guillemets pour éviter la division des mots echo. Utilisez -vdans bashdepuis 4.0 pour éviter de démarrer un sous-processus. Utilisez la post-incrémentation car votre code actuel ne mettra dans le premier fichier que 999 lignes. a=0; while IFS='' read -r line; do printf -v filename "%04d.txt" $((a++/1000)); echo "$line" >> "$filename"; done
manatwork

@manatwork Merci. Seul mon printfn'a pas d' -vinterrupteur. ( bash 4.2.10). Au moins, ce n'est pas dans la page de printf
manuel

1
man printfdocuments / usr / bin / printf, qui ne pourraient jamais dans la vie définir une variable d'environnement. Voir help printfpour la documentation du printfshell intégré.
manatwork

@manatwork OK. Il semble y avoir erreur de syntaxe dans la ++/encore partie.
xralf

1
Une dernière chose: il n'est pas nécessaire d'utiliser sigil dans l'évaluation arithmétique, sauf si vous avez besoin explicitement de l'expansion des paramètres. Dans l'expansion arithmétique, les variables sont de toute façon évaluées.
manatwork
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.