Divida o arquivo em vários arquivos com base no padrão

Divida o arquivo em vários arquivos com base no padrão

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 quero 6 arquivos de saída. Estou familiarizado com split e awk, mas não consigo criar uma linha de comando que faça o que descrevi, alguma ideia?

Aqui está um exemplo

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

Gostaria de três arquivos em que ABC seja a primeira linha do novo arquivo e termine antes que o próximo ABC seja encontrado.

Responder1

Usandocsplit

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 desejar - consulteman csplit

Responder2

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

O procedimento acima dividirá o arquivo conforme solicitado, não importa quantas instâncias da linha do marcador você tenha, e então removerá o marcador dos arquivos resultantes. Os arquivos de saída serão chamados, por exemplo splitfile_00, splitfile_01, e assim por diante.

Separando esse bit no final da csplitinvocação:: "{$(($(grep -c $NEEDLE HAYSTACK)-1))}"Usamos o subshell greppara obter o número de instâncias do seu marcador dentro do arquivo e subtraímos um - isso informa csplitexatamente quantas divisões ele fará.

Observe que, conforme escrito, as coisas podem ficar em forma de pêra se o seu marcador aparecer nos dados.

informação relacionada