Dividir arquivo pelo número de linhas incluindo cabeçalho em cada uma

5

Eu preciso dividir um arquivo .txt em arquivos menores contendo 100 linhas cada, incluindo o cabeçalho. Não sei se isso é relevante, mas o arquivo original é delimitado assim:

COLUMN1 | COLUMN2 | COLUMN3
1 | 2 | 3
4 | 5 | 6
7 | 8 | 9

Eu preciso de todos os arquivos gerados a partir desta divisão para ter a linha de cabeçalho. Além disso, eles precisam ser gerados em / movidos para outro diretório e seguir um padrão de nome, como file_01.txt , file_02.txt , etc

    
por Geralt 14.04.2016 / 21:32

3 respostas

5

Com gnu split , você pode salvar o cabeçalho em uma variável e split a partir da segunda linha, usando a opção --filter para gravar o cabeçalho primeiro e depois as 99 linhas de cada peça e também especificar o diretório de saída (por exemplo, path to/output dir/ ):

header=$(head -n 1 infile.txt)
export header
tail -n +2 infile.txt | split -l 99 -d --additional-suffix=.txt \
--filter='{ printf %s\n "$header"; cat; } >path\ to/output\ dir/$FILE' - file_

isto irá criar peças de 100 linhas como

path to/output dir/file_01.txt
path to/output dir/file_02.txt
path to/output dir/file_03.txt
..............................
    
por 14.04.2016 / 22:38
5
awk 'NR==1        {a=$0}
    (NR-1)%100==0 {print a > "d/file_" int(1+(NR-1)/100)}
                  {print   > "d/file_" int(1+(NR-1)/100)}' 
    
por 14.04.2016 / 23:43
3

Funciona para mim no bash:

lines=100; { read header && sed "1~$((${lines}-1)) s/^/${header}\n/g" | split -l $lines --numeric-suffixes=1 --additional-suffix=.txt - file_ ; } < inputfile.txt
    
por 14.04.2016 / 22:53

Tags