Adicionado '\ n' após o número fixo de um delimitador multicharacter

1

Eu tenho a tarefa de analisar um arquivo de texto de linha única muito grande para colocar em um banco de dados. O arquivo contém grandes quantidades de dados de texto (48 shows) e foi fornecido neste formato:

col1*#(%&col2*#(%&col3*#(%&col4*#(%&col5*#(%&col1*#(%&col2*#(%&col3*#(%&col4...

Portanto, o delimitador neste arquivo é '* # (% &' as colunas basicamente fazem um loop de col1-col5 em uma única linha.

Meu objetivo é tentar colocá-los em um formato de registro, por exemplo:

col1*#(%&col2*#(%&col3*#(%&col4*#(%&col5*#(%&
col1*#(%&col2*#(%&col3*#(%&col4*#(%&col5*#(%&
col1*#(%&col2*#(%&col3*#(%&col4*#(%&col5*#(%&

Então eu quero adicionar um '\ n' depois de cada 5 '* # (% &'. Eu olhei ao redor e encontrei um útil comando sed que é capaz de fazer tal thing :

sed -r 's/([^\*#\(%\&|]*\*#\(%\&){5}/&\n/g'

Na maioria das vezes, isso funciona, no entanto, devido a col4 ser um campo de texto enorme, notei que para registros em que um col contém qualquer caractere único de ' # (% &' ie '#', a contagem parece redefinir e não está se comportando da maneira que eu quero.Existe uma maneira de ajustar ou evitar isso aconteça? Eu só quero uma nova linha apenas quando o padrão exato de ' # (% & 'ocorre.

    
por user3348557 08.10.2018 / 02:03

2 respostas

1

Com o GNU awk , você poderia fazer algo como:

gawk -v RS='\*#\(%&' -v ORS= '{print $0 RT};NR%5 == 0{printf "\n"}'

Com sed (mas tenha em atenção que algumas implementações de sed têm um limite baixo no tamanho das linhas):

sed 's/*#(%&/&\
/5;P;D'
    
por 08.10.2018 / 15:36
0
perl -F'\*#\(%&' -lane 'print join "*#(%&", splice @F, 0, 5 while @F'

Trabalhando:

 ° Split on the string '*#(%&'  it is stored in the array @F.
 ° Then, while the array still has elements in it, pluck out the leading 5, or whatever are left in the last gasp, and join these with the same string they were split on. And this is printed to stdout followed by a newline which is ensured by the '-l' option. 
    
por 08.10.2018 / 19:47

Tags