Como adicionar quebras de linha após cada enésima instância de um delimitador em perl

2

Eu estou olhando para escrever um script que irá abrir um arquivo data.txt e adicionar uma quebra de linha após cada enésima instância do "|" delimitador, de modo que cada linha contenha uma observação com todas as quatro variáveis. Basicamente, dividindo e remodelando uma única linha de largura para longa. Obrigado pela sua ajuda.

Entrada:

a1|b1|c1|d1|a2|b2|c2|d2|a3|b3|c3|d3|a4|b4|c4|d4

Saída:

a1|b1|c1|d1|   
a2|b2|c2|d2|   
a3|b3|c3|d3|  
a4|b4|c4|d4
    
por Andy 07.12.2016 / 22:09

3 respostas

3

Você poderia fazer:

perl -pe 's/(.*?\|){4}\K/\n/g'
    
por 07.12.2016 / 22:14
2

Usando Sed:

Portável:

sed -e 's/|/&\
/4;P;D' file

Se você estiver usando o GNU Sed, você pode usar o \n não padrão para representar um caractere de nova linha no padrão de substituição:

sed -e 's/|/&\n/4;P;D' file

O comando s insere uma nova linha após o quarto | no espaço de padrão.

O comando P imprime até a primeira nova linha a partir do espaço padrão.

O comando D é excluído da primeira nova linha do espaço padrão.

Se não houver substituição feita (menos de quatro | caracteres no espaço padrão), o espaço padrão não conterá nenhuma nova linha - assim, o comando P estará imprimindo o inteiro espaço de padrão, e o comando D excluirá todo o espaço de padrão e, em seguida, a próxima linha do arquivo será lida e o loop iniciado novamente.

    
por 07.12.2016 / 22:36
1

tr e cole, não o seu resultado exato

tr '|' '\n' <file | paste -d'|' - - - -
a1|b1|c1|d1
a2|b2|c2|d2
a3|b3|c3|d3
a4|b4|c4|d4

awk

awk -F'|' -v OFS='|' -v n=4 '{for (i=n+1; i<=NF; i+=n) $i = "\n" $i; print}' file
a1|b1|c1|d1|
a2|b2|c2|d2|
a3|b3|c3|d3|
a4|b4|c4|d4
    
por 07.12.2016 / 22:25