Pretende substituir todo o ciclo while
no seu script:
awk '{print substr($0, 31)>("replay_message_" NR-1 ".txt")}' file
Como funciona:
-
print substr($0, 31)
Isto imprime todos menos os primeiros trinta caracteres da linha.
-
>("replay_message_" NR-1 ".txt")
Isso envia o que foi impresso em um arquivo com o nome do número da linha.
Quando o comando awk terminar a execução, haverá uma série de arquivos em seu diretório, como:
$ ls -1 replay_message*
replay_message_0.txt
replay_message_1.txt
replay_message_2.txt
replay_message_3.txt
Alternativa caso o tamanho do timestamp varie
awk '{sub(/.* E[SD]T [[:digit:]]{4}: /, ""); print >("replay_message_" count++ ".txt")}' file
Como funciona
o awk lê implicitamente um arquivo de um registro (linha) por vez. Para cada linha:
-
sub(/.* EDT [[:digit:]]{4}: /, "")
Isso remove o timestamp do início da linha.
A regex corresponde a tudo até um espaço, o fuso horário (EST ou EDT), um espaço, quatro dígitos para o ano, dois pontos e um espaço.
Como alternativa, se fosse garantido que seu timestamp leva apenas 30 caracteres, uma substituição mais simples poderia ser usada:
sub(/.{30}/, "")
Com base nos seus arquivos de entrada, você terá que decidir o que melhor se adapta à sua situação.
-
print >("replay_message_" count++ ".txt")
Isso grava a linha modificada em um arquivo que inclui um count
number. O ++
faz com que count
seja incrementado com cada gravação.