O formatador de texto par
(e o GNU sed
) (veja o final para não- par
solution):
$ tr -s ' ' <file.in | awk '{ print $0, "\n" }' | par 50p8h | sed -r -e '/^$/d' -e 's/^ {8}/\t/'
11430.00 SH: gry to dk gry, firm to mod hd, plty,
flk, ea to gt, abd LCM; SLTST: gry, sft to
firm, amor to blky, slty to ea
11460.00 SH: gry to dk gry, firm to mod hd, plty,
flk, ea to gt, abd LCM; SLTST: gry, sft to
firm, amor to blky, slty to ea
11490.00 MRL: lt gry, mod hd, blky, occ flk, wxy;
SH: gry to dk gry, firm to mod hd, plty,
occ blky, ea to gt; SLTST: gry to dk gry,
mod firm to firm, amor, blky, slty
11520.00 SH: gry to dk gry, firm to mod hd, plty,
blky, ea to gt, tr MRL, occ LCM; SLTST:
gry, occ brnsh rd, firm, amor to blky, ea
to g
-
tr -s ' '
compacta vários espaços sucessivos em um. - O código
awk
apenas adiciona uma nova linha extra a cada linha de entrada. -
par 50p8h
formata o texto resultante para uma largura de 50 caracteres com 8 caracteres de recuo deslocado. - As expressões
sed
excluem linhas vazias e substituem execuções de 8 espaços no início de uma linha com um único caractere de tabulação.
Para uma solução que não use o GNU sed
, você deve inserir um caractere de tabulação literal no lugar de \t
na última expressão sed
.
Para uma solução que usa espaços para o recuo e que alinha o recuo à esquerda, exatamente como na captura de tela (9 espaços):
$ tr -s ' ' <file | awk '{ print $0, "\n" }' | par 50p9h | sed -e '/^$/d'
11430.00 SH: gry to dk gry, firm to mod hd, plty,
flk, ea to gt, abd LCM; SLTST: gry, sft
to firm, amor to blky, slty to ea
11460.00 SH: gry to dk gry, firm to mod hd, plty,
flk, ea to gt, abd LCM; SLTST: gry, sft
to firm, amor to blky, slty to ea
11490.00 MRL: lt gry, mod hd, blky, occ flk, wxy;
SH: gry to dk gry, firm to mod hd, plty,
occ blky, ea to gt; SLTST: gry to dk gry,
mod firm to firm, amor, blky, slty
11520.00 SH: gry to dk gry, firm to mod hd, plty,
blky, ea to gt, tr MRL, occ LCM; SLTST:
gry, occ brnsh rd, firm, amor to blky, ea
to g
Adicionar j
a 50p9h
justificará os parágrafos bem:
11430.00 SH: gry to dk gry, firm to mod hd, plty,
flk, ea to gt, abd LCM; SLTST: gry, sft
to firm, amor to blky, slty to ea
11460.00 SH: gry to dk gry, firm to mod hd, plty,
flk, ea to gt, abd LCM; SLTST: gry, sft
to firm, amor to blky, slty to ea
11490.00 MRL: lt gry, mod hd, blky, occ flk, wxy;
SH: gry to dk gry, firm to mod hd, plty,
occ blky, ea to gt; SLTST: gry to dk gry,
mod firm to firm, amor, blky, slty
11520.00 SH: gry to dk gry, firm to mod hd, plty,
blky, ea to gt, tr MRL, occ LCM; SLTST:
gry, occ brnsh rd, firm, amor to blky, ea
to g
... e adicionando l
a isso também forçará a última linha de cada parágrafo (não tão legal):
11430.00 SH: gry to dk gry, firm to mod hd, plty,
flk, ea to gt, abd LCM; SLTST: gry,
sft to firm, amor to blky, slty to ea
11460.00 SH: gry to dk gry, firm to mod hd, plty,
flk, ea to gt, abd LCM; SLTST: gry,
sft to firm, amor to blky, slty to ea
11490.00 MRL: lt gry, mod hd, blky, occ flk, wxy;
SH: gry to dk gry, firm to mod hd, plty,
occ blky, ea to gt; SLTST: gry to dk
gry, mod firm to firm, amor, blky, slty
11520.00 SH: gry to dk gry, firm to mod
hd, plty, blky, ea to gt, tr MRL,
occ LCM; SLTST: gry, occ brnsh
rd, firm, amor to blky, ea to g
par
está disponível na maioria dos gerenciadores de pacotes na maioria dos Unices, mas você também pode encontrar suas fontes (para se compilar) no link
Solução usando fmt
em vez de par
$ tr -s ' ' <file.in | awk '{ print $0, "\n" }' | fmt -w 50 |
awk '/^[^0-9]/ { $0 = " " $0 }
{ print }' | fmt -w 50 | sed '/^$/d'
11430.00 SH: gry to dk gry, firm to mod hd, plty,
flk, ea to gt, abd LCM; SLTST: gry, sft
to firm, amor to blky, slty to ea
11460.00 SH: gry to dk gry, firm to mod hd, plty,
flk, ea to gt, abd LCM; SLTST: gry, sft
to firm, amor to blky, slty to ea
11490.00 MRL: lt gry, mod hd, blky, occ flk, wxy;
SH: gry to dk gry, firm to mod hd, plty,
occ blky, ea to gt; SLTST: gry to dk gry,
mod firm to firm, amor, blky, slty
11520.00 SH: gry to dk gry, firm to mod hd, plty,
blky, ea to gt, tr MRL, occ LCM; SLTST:
gry, occ brnsh rd, firm, amor to blky, ea
to g
fmt
não é tão flexível em sua formatação e aqui precisamos usá-lo duas vezes para obter o resultado pretendido. Também usamos o fato de que cada linha original começa com um dígito.
-
tr -s ' '
, como antes. -
awk '{ print $0, "\n" }'
, como antes. - A primeira
fmt
call (fmt -w 50
) está lá para obter a primeira linha de cada parágrafo na largura correta (50 caracteres). - O script
awk
recuará cada linha que não começar com um dígito por 9 espaços. - A segunda chamada
fmt
formatará todo o texto para 50 caracteres, mas agora as linhas recuadas permanecerão recuadas. - A expressão
sed
exclui linhas vazias.