Digamos, eu tenho um comando command
que imprime um grande número de linhas no stdout:
line1
line2
.....
lineN
Quero salvar a saída em disco, mas não como um único arquivo, mas como uma sequência de arquivos, cada um com 1000 linhas de stdout:
file0001.txt:
-------------
line1
....
line1000
file0002.txt:
-------------
line1001
....
line2000
etc
Tentei pesquisar no Google a resposta, mas sempre que o Google me aponta para o tee
comando, o que é inútil nessa situação. Provavelmente, estou inserindo consultas erradas.
fonte
split [arguments...] [input e.g. "-" for stdin] [output_prefix]
, por exemplo:tar -c somedir | split --byes 100MB --numeric-suffixes --suffix-length=3 - somedir.tar.part-
produziria um monte de arquivos de 100 MB chamadosomedir.tar.part-000
001, 002 e assim por diante.Você pode usar um script bash
lines.bash
e use-o como:
cat long_file.txt | bash lines.bash
O único problema que notei é com o
*
loginlong_file.txt
(alguém pode corrigi-lo).fonte
IFS
string vazia para evitar a divisão de palavrasread
. Use-r
para desativar a barra invertidaread
. Remova-e
para evitar que a barra invertida escapeecho
. Use aspas para evitar a divisão de palavrasecho
. Use-v
nobash
4.0 para evitar iniciar um subprocesso. Use pós-incremento, pois seu código atual colocará no primeiro arquivo apenas 999 linhas.a=0; while IFS='' read -r line; do printf -v filename "%04d.txt" $((a++/1000)); echo "$line" >> "$filename"; done
printf
não tem-v
switch. (bash 4.2.10
) Pelo menos não está na página de manual deprintf
man printf
documentos / usr / bin / printf, que nunca poderiam na vida definir uma variável de ambiente. Vejahelp printf
a documentaçãoprintf
interna do shell.++/
parte ainda.