Divide as linhas de um arquivo de texto em arquivos separados

7

Eu tenho um arquivo de texto que se parece com isso:

foo
bar
zip
rar
tar

Eu preciso usar um script bash no OSX para criar um novo arquivo de texto após cada nova linha como esta:

cat text1.txt
foo
cat text2.txt
bar
cat text3.txt
zip
cat text4.txt 
rar
cat text5.txt
tar
    
por DisplayName 30.10.2014 / 01:57

3 respostas

8

Você pode usar csplit . Ele faz o trabalho bem, exceto que é um pouco inflexível em relação aos nomes dos arquivos de saída (você só pode especificar um prefixo, não um sufixo) e você precisa de um primeiro passo para calcular o número de peças.

csplit -f text -- input.txt '//' "{$(wc -l input.txt)}"
for x in text[0-9]*; do mv -- "$x" "$x.txt"; done

A versão GNU, mas não a versão OSX, possui extensões que resolvem os dois problemas.

csplit -b '%d.txt' -f text -- input.txt '//' '{*}'

Como alternativa, se csplit for muito inflexível, você pode usar o awk.

awk '{filename = sprintf("text%d.txt", NR); print >filename; close(filename)}' input.txt
    
por 30.10.2014 / 02:06
2

Versão com bash puro ...

unset i; while read -r l; do echo $l > "text$((++i)).txt";done < text_file.txt
    
por 30.10.2014 / 02:05
1

Supondo que o conteúdo do arquivo de texto não contenha espaços, você também pode usar um loop for no Bash.

$ for x in $(<file.txt); do echo "$x" > text$((++i)).txt; done

Exemplo

$ cat file.txt 
foo
bar
zip
rar
tar

Agora com $i não definido.

$ unset i
$ for x in $(<file.txt);do echo "$x" > text$((++i)).txt;done
$ ls -l text*
-rw-rw-r--. 1 slm slm 4 Oct 29 22:03 text1.txt
-rw-rw-r--. 1 slm slm 4 Oct 29 22:03 text2.txt
-rw-rw-r--. 1 slm slm 4 Oct 29 22:03 text3.txt
-rw-rw-r--. 1 slm slm 4 Oct 29 22:03 text4.txt
-rw-rw-r--. 1 slm slm 4 Oct 29 22:03 text5.txt

Confirmando os resultados:

$ head text*
==> text1.txt <==
foo

==> text2.txt <==
bar

==> text3.txt <==
zip

==> text4.txt <==
rar

==> text5.txt <==
tar
    
por 30.10.2014 / 03:05