Dividir arquivo em vários arquivos com base no padrão [duplicado]

2

Eu tenho um arquivo grande com algumas centenas de linhas. Este arquivo é particionado em várias partes por um identificador específico, digamos 'ABC'. Esta linha 'ABC' aparece 6 vezes, então eu quero 6 arquivos de saída. Estou familiarizado com o split e o awk, mas não consigo criar uma linha de comando que faça o que eu descrevi, alguma idéia?

Veja um exemplo

ABC
line 1
line 2
line 3
ABC
line 1
line 2
ABC
line1

Eu gostaria de três arquivos em que o ABC é a primeira linha do novo arquivo e termina antes do próximo ABC ser encontrado.

    
por openingceremony 17.02.2016 / 19:36

2 respostas

3

Usando csplit

csplit -z somefile /ABC/ {*}

Os arquivos de saída serão xx00 , xx01 , ... por padrão, mas você pode alterar o formato e a numeração, se desejado - veja man csplit

    
por 17.02.2016 / 20:36
1
NEEDLE=ABC
HAYSTACK=/path/to/bigfile
csplit -f splitfile_ $HAYSTACK /$NEEDLE/ "{$(($(grep -c $NEEDLE HAYSTACK)-1))}"
for file in splitfile_*; do
    sed --in-place "s/$NEEDLE//" $file
done

Os itens acima dividirão o arquivo conforme solicitado, independentemente de quantas instâncias da linha do marcador você tiver, e então removerão o marcador dos arquivos resultantes. Os arquivos de saída serão chamados e. g. splitfile_00 , splitfile_01 e assim por diante.

Separando esse bit no final da invocação csplit : "{$(($(grep -c $NEEDLE HAYSTACK)-1))}" : Usamos o subshell grep para obter o número de instâncias do seu marcador no arquivo e subtraímos um. Isso indica csplit exatamente quantas divisões serão feitas.

Note que, conforme escrito, as coisas podem ficar em forma de pêra se o marcador aparecer dentro dos dados.

    
por 17.02.2016 / 20:06