Divide um arquivo de texto grande

4

Eu tenho um grande arquivo de texto agrupado com cabeçalhos separados que eu preciso dividir em arquivos separados.

Por exemplo, o arquivo tem cabeçalhos como este:

--Heading 1--
some text
text

--Heading 2--
more text etc

--Heading 3--
asdf text

Eu preciso dividir o arquivo grande em arquivos de texto com base em seus cabeçalhos.

Então, para o exemplo, haveria uma saída de 3 arquivos.

Título 1.txt:

--Heading 1--
some text
text

Título 2.txt:

--Heading 2--
more text etc

Título 3.txt:

--Heading 3--
asdf text

Alguém sabe de um aplicativo ou script do windows ou do max que pode fazer isso?

Ou talvez dê instruções sobre como escrever algo assim em uma linguagem de programação. Eu não sei python ou java, mas talvez esta seja a hora de aprender. :)

obrigado!

    
por Ben 04.03.2010 / 06:49

2 respostas

3

Esta não é a resposta mais simples, esperamos que alguém venha com algo mais puro. Eu montei um pequeno script que fará isso e funcionará no Mac.

#!/bin/bash
NUMFILES='grep '^--.*--' $1 | wc -l'
NUMFILES=$(($NUMFILES - 2))
csplit -k $1 '%^--.*--$%' '/^--.*--$/' "{$NUMFILES}" 
for file in 'ls xx*'
do
        mv $file "'head -n1 $file | sed -e 's/--\(.*\)--/.txt/''"
done

Isso funciona usando csplit para dividir o arquivo. A quarta linha basicamente diz ignorar tudo antes da primeira linha de cabeçalho e depois dividir os cabeçalhos depois disso. linhas 2-3 calcular quantas vezes csplit tem que dividir o arquivo.

csplit nomeia seus arquivos de saída xx seguidos de um número de 2 dígitos. As últimas 4 linhas renomear todos esses arquivos para o que estiver na linha de cabeçalho com o -- removido.

    
por 04.03.2010 / 09:46
2

Aqui está um "one liner" 8-]. É semelhante ao que Martin fez. Isso funcionará no seu Mac. Basta abrir o aplicativo "Terminal" e navegar até o diretório que contém myfile.txt

split -p '--.*--' myfile.txt FILE && for file in FILE*; do mv $file "$(head -1 $file | sed 's/--//g')".txt; done

PS. Certifique-se de que não haja arquivos no diretório com o nome FILE *. ou seja, certifique-se de que ls FILE* não mostra nada.

    
por 04.03.2010 / 11:59