Há muitas linhas em um arquivo, como as seguintes:
000100667 ===> 000102833
005843000 ===> 005844000
011248375 ===> 011251958
Gostaria de inserir separadores específicos nos números como este:
00:01:00,667 ===> 00:01:02,833
00:58:43,000 ===> 00:58:44,000
01:12:48,375 ===> 01:12:51,958
No momento estou tentando (sucesso apenas na primeira parte):
echo 000100667 | gawk '{printf "%s:%s:%s,%s\n", $1, $2, $3, $4}' FIELDWIDTHS="2 2 2 3"
Com os exemplos apresentados, tente o seguinte
awk
código. Escrito e testado com GNUawk
.Com
FIELDWIDTHS
solução: Escrito e testado com amostras mostradas.Com GNU sed:
Ele separa qualquer sequência de nove caracteres que começa com um dígito como este (dígitos são posições dentro do padrão):
123456789
torna-se12:34:56,789
.Se for muito genérico, o
.
("qualquer caractere") deve ser substituído por[0-9]
("dígito").Saída:
Usando sed com o
-E
sinalizador:Para corresponder exatamente às strings em uma linha.
O
-E
sinalizador/opção que é ERE agora é padrão para sed de acordo com POSIXO comportamento pode variar dependendo das configurações locais , que afetam como as classes de caracteres
[[:digit:]]
são[a-z]
interpretadas.Isso pode funcionar para você (GNU sed):
Use correspondência de padrões e substituição com referências posteriores.
Para uma
belt and braces
abordagem:Ou:
Usando um awk que suporte
gensub()
GNUawk
oumawk2
:ou usando qualquer
awk
:Eu melhoraria sua solução da seguinte maneira, deixe
file.txt
o conteúdo serentão
dá saída
Explicação: Usei FIELDWIDTHS literalmente, mas informei ao GNU Awk que a linha pode ser separada por
===>
(incluindo espaços) OU (|
) quebra de linha. Altereiprintf
para que o último caractere seja o terminador de linha (RT
), então ===> para valores à esquerda de ===> e quebra de linha para todos os outros.(testado no GNU Awk 5.3.1)