Você poderia fazer:
perl -pe 's/(.*?\|){4}\K/\n/g'
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
Você poderia fazer:
perl -pe 's/(.*?\|){4}\K/\n/g'
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.
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
Tags text-processing perl