Como dividir o stdout para ir para vários arquivos de saída?

12

Digamos que eu tenha um comando command que imprime um grande número de linhas no stdout:

line1
line2
.....
lineN

Eu quero salvar a saída em disco, mas não como um único arquivo, mas como uma seqüência de arquivos, cada um com 1000 linhas de stdout:

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

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

etc

Eu tentei google a resposta, mas toda vez que o google me aponta para o comando tee , que é inútil nesta situação. Provavelmente, estou inserindo consultas erradas.

    
por DNNX 06.12.2011 / 11:57

2 respostas

24

Quando terminar de salvar o arquivo, você poderá sempre split do arquivo em arquivos ou em vários arquivos com base no número de linhas.

split -l 1000 output_file

ou melhor ainda, tente

command | split -l 1000 -

Isso dividirá o fluxo de saída em arquivos com cada 1000 linhas (o padrão é 1000 linhas sem a opção -l).

O comando abaixo lhe dará flexibilidade adicional para colocar ou impor um prefixo ao nome do arquivo que será gerado quando a saída for gerada e dividida para armazenar no arquivo.

command | split -l 1000 - small-

    
por 06.12.2011 / 12:02
3

Você pode usar um 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

e use-o como:

cat long_file.txt | bash lines.bash

O único problema que notei é com * entrar em long_file.txt (alguém poderia corrigi-lo).

    
por 06.12.2011 / 14:30