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
sprintf
reagrupa o ano, mês, dia, hora, minutos e segundos, com zeros à esquerda, se necessário. Atribuir isso a$3
reconstró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|Data5
este 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/bash
ou#!/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
./gman
seguido por uma lista de nomes de arquivos e / ou curingas ou por<
e um único nome de arquivo.
- A primeira linha deve ser