Dividindo um arquivo txt grande a cada 100 linhas e incluindo o cabeçalho original (em um Mac)

1

Estou procurando uma ferramenta ou script (Textwrangler ou Terminal) que possa dividir um arquivo de texto maior a cada 100 linhas contando a partir da linha 5 (os primeiros 4 são linhas de cabeçalho) e gerar arquivos .txt individuais que incluam o cabeçalho original.

Por exemplo

entrada:

File.txt
line1 / line4   HEADER
...
line5 / line265 DATA

saída:

File_01.txt
line1/line4   HEADER
line5/line104 DATA

File_02.txt
line1/line4   HEADER
line5/line104 DATA

File_03.txt
line1/line4   HEADER
line5/line65  DATA

O arquivo de texto usa as quebras de linha do Windows (CR LF) no caso que importa.

No momento, estou fazendo isso manualmente, portanto, quaisquer sugestões que possam tornar esse processo mais eficiente são muito bem-vindas.

    
por Dan 14.09.2010 / 11:21

2 respostas

5
  1. Remova o cabeçalho e coloque-o em um arquivo separado header.txt .
  2. dividir os dados usando split --lines=100 data.txt (isso gera muitos arquivos com 100 linhas neles nomeados xaa xab xac e assim por diante)
  3. Em seguida, anexe o cabeçalho a cada arquivo for a in x??; do cat header.txt $a > $a.txt; done Isso resulta em seus arquivos de dados acabados (com cabeçalhos) sendo chamados xaa.txt xab.txt xac.txt ...

Se a quantidade de dados for tão grande (ou você dividir em menos linhas) que os arquivos xxx não são suficientes, a divisão torna quatro arquivos nomeados por letras. Nesse caso, insira um ? extra na for -exposição acima.

Editar:
Para automatizar a extração do cabeçalho, use head -4 origdata.txt > header.txt para extrair as primeiras quatro linhas. Use tail -n +4 origdata.txt > data.txt para extrair tudo, exceto as quatro primeiras linhas. Agora você tem dois arquivos, um com o cabeçalho e outro com os dados. Não deve ser muito difícil combinar isso com um script. (Eu não tenho acesso ao bash hoje)

    
por 14.09.2010 / 12:14
3

Com base na resposta fornecida pelo Nifle, fiz um script que executa seus comandos sugeridos, adiciona o nome do arquivo original à saída e limpa os arquivos temporários.

#!/bin/bash

FILE=$(ls -1 | grep filename.txt)
NAME=${FILE%%.txt}

head -4 $FILE > header.txt
tail -n +5 $FILE > data.txt

split -l 100 data.txt

for a in x??
    do
        cat header.txt $a > $NAME.$a.txt
    done

mv $FILE $NAME.orig.txt
rm header.txt data.txt x??

Et voila!

    
por 15.09.2010 / 14:53