Dis, j'ai une commande command
qui 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 tee
commande, ce qui est inutile dans cette situation. Probablement, je saisis des requêtes erronées.
la source
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éssomedir.tar.part-000
, 001, 002 ans, etc.Vous pouvez utiliser un script bash
lines.bash
et l'utiliser comme:
cat long_file.txt | bash lines.bash
Le seul problème que j'ai remarqué est la
*
connexionlong_file.txt
(quelqu'un pourrait le corriger).la source
IFS
chaîne vide pour éviter la division des motsread
. Utilisez-r
pour désactiver l'échappement de la barre oblique inverseread
. Supprimer-e
pour éviter que la barre oblique inverse ne s'échappeecho
. Utilisez des guillemets pour éviter la division des motsecho
. Utilisez-v
dansbash
depuis 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
printf
n'a pas d'-v
interrupteur. (bash 4.2.10
). Au moins, ce n'est pas dans la page deprintf
man printf
documents / usr / bin / printf, qui ne pourraient jamais dans la vie définir une variable d'environnement. Voirhelp printf
pour la documentation duprintf
shell intégré.++/
encore partie.