
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 csplit
invocação:: "{$(($(grep -c $NEEDLE HAYSTACK)-1))}"
Usamos o subshell grep
para obter o número de instâncias do seu marcador dentro do arquivo e subtraímos um - isso informa csplit
exatamente 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.