copiar seções de um arquivo grande em muitos arquivos de saída

0

Eu tenho um arquivo grande que parece:

Header1

Subheader1

l1 

l1'

l1''

Header2

Subheader2

l2 

l2'

l2''

Headern

Subheader n

ln

ln'

ln''

(em que n é ~ 25K)

Eu preciso colar l1-l1'', l2-l2'' ... ln-ln'' em arquivos diferentes - digamos file1, file2, ... file n (em um determinado número de linha dentro dos arquivos).

    
por Chemist 20.06.2018 / 08:15

2 respostas

0

Você não especifica a relação entre cabeçalhos e linhas. Mas se a relação é um número constante de linhas, você pode recuperar os números de linhas com o grep e usar sed para extrair as linhas.

Por exemplo, para obter todas as linhas após o Subheader:

#!/bin/bash 

file_in=/tmp/test.txt
file_out=/tmp/file1.txt
LINES='grep -n Subheader $file_in | cut -f1 -d:'
for line in $LINES; do
  echo $line
  line1=$(($line+1))
  sed -n ${line1}p $file_in >> $file_out
done

Editar: você pode executar o script acima em um loop:

#!/bin/bash

n_max=100
file_in=/tmp/test.txt
file_out=/tmp/file

LINES='grep -n Subheader $file_in | cut -f1 -d:'
for n in 'seq 1 $n_max'; do
  echo "line $n"
  for line in $LINES; do
    line_n=$(($line+$n))
    sed -n ${line_n}p $file_in >> $file_out$n.txt
  done
done
exit 0
    
por 20.06.2018 / 10:01
0

Podemos fazer isso da seguinte maneira:

perl -Mautodie -lne '
   if ( /Subheader/ ... /Header/ ) {
      open FILE, q[>>], q[file] . ++$a if /Subheader/;
      close FILE if /Header/;
      print FILE if !/Subheader/ && !/Header/;
   }
' large_file.log

Isto irá criar os mini-arquivos file1, file2, etc.

Perl abre um novo filehandle quando encontra uma linha Subheader. E fecha esse filehandle quando encontra a linha Header. para todas as outras linhas, ele imprime no filehandle.

    
por 20.06.2018 / 14:02