Uma solução awk pura (que não separa um comando date ):
awk -F'|' -vOFS='|' '
function fail() {
printf "Bad data at line %d: ", NR
print
next
}
{
if (split($3, date_time, " ") != 3) fail()
if (split(date_time[1], date, "/") != 3) fail()
if (split(date_time[2], time, ":") != 3) fail()
if (time[1] == 12) time[1] = 0
if (date_time[3] == "PM") time[1] += 12
$3 = sprintf("%.4d%.2d%.2d %.2d:%.2d:%.2d", date[3], date[1], date[2], time[1], time[2], time[3])
print
}'
-
-F'|'divide a linha de entrada em barras verticais em$1,$2,$3, etc… -
split($3, date_time, " ")divide o campo de data / hora em três partes: a data, a hora e o indicador AM / PM. Se não houver três partes, emita uma mensagem de erro e pule a linha. -
split(date_time[1], date, "/")divide a data no mês, no dia e no ano. -
split(date_time[2], time, ":")divide o tempo na hora, nos minutos e nos segundos. - Faça um pouco de matemática na hora; por exemplo, 12:42 é 00:42 em 24 horas. E, claro, PM adiciona 12 horas.
- O
sprintfreagrupa o ano, mês, dia, hora, minutos e segundos, com zeros à esquerda, se necessário. Atribuir isso a$3reconstrói a linha de entrada com a data / hora reformatada; nós então imprimimos isso. -
Recurso: se a entrada tiver mais de três campos; por exemplo,
Data1|Data2|10/24/2017 8:10:00 AM|Data4|Data5este script preservará esses campos extras.
Uso: Algumas pequenas variações:
- Digite o comando de várias linhas acima e, no final da última linha
(logo após
}'), coloque o (s) nome (s) do (s) arquivo (s) que deseja processar. Você pode (obviamente) usar curingas (por exemplo,*.csv) aqui, além de ou em vez de nome (s) de arquivo (s). - O mesmo que o acima, mas depois de
}', digamos<e um nome de arquivo. (Você pode processar apenas um arquivo de cada vez dessa maneira). - Crie um arquivo de script.
- A primeira linha deve ser
#!/bin/sh. (Ou, se preferir, você pode usar#!/bin/bashou#!/usr/bin/env bash. Uma discussão sobre as diferenças entre essas diferentes linhas “she-bang”, e seus méritos e contraindicações relativos, está além do escopo desta questão, mas você pode encontrar muitos discursos sobre o assunto se você pesquisar. - Em seguida, coloque o código acima começando na linha2.
- No final da última linha (logo após
}'), coloque"$@"( incluindo as aspas). - Salve o arquivo.
Vamos supor que você chame o script
gman. - Digite
chmod +x gman. - Digite
./gmanseguido por uma lista de nomes de arquivos e / ou curingas ou por<e um único nome de arquivo.
- A primeira linha deve ser