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
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.
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
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.
Tags text-processing awk