Use o awk para preencher formatos de data e hora

4

Eu gostaria de usar awk para preencher os campos de data e hora no meu relatório. Aqui está o meu .csv atual que é, na verdade, delimitado por tabulações.

AA  9/7/2014 2:30:38 PM     AA0000011111    08 Y    A       Jane, Doe
AA  9/7/2014 11:30:31 AM     AA0000011112    09 Y    B       John, Doe
AA  9/7/2014 7:30:45 AM     AA0000011113    20 Y    A       Jane, Doe A
AA  9/8/2014 11:01:14 AM    AA0000011114    30 Y    A       John, Doe A
AA  9/8/2014 2:30:46 PM     7BD1111111115   40 Y    B       Jane, Doe A
AA  9/8/2014 2:31:00 PM     AA0000011116    50 Y    A       John, Doe A
AA  9/8/2014 7:30:53 AM     AA0000011117    60 Y    B       Jane, Doe
AA  9/9/2014 7:30:27 AM     AA0000011118    70 Y    A       John, Doe A
AA  9/9/2014 7:30:41 AM     AA0000011119    80 Y    B       Jane, Doe
AA  9/9/2014 7:30:55 AM     AA0000011110    90 Y    A       John, Doe
AA  9/14/2014 7:30:55 AM     AA0000011111    80 Y    A       Jane, Doe A
AA  11/11/2014 7:30:55 AM     AA0000011112    80 Y    A       John, Doe A

Gostaria de preencher todas as datas e horários para facilitar a leitura e a classificação. Assim:

AA  09/07/2014 02:30:38 PM     AA0000011111    08 Y    A       Jane, Doe
AA  09/07/2014 11:30:31 AM     AA0000011112    09 Y    B       John, Doe
AA  09/07/2014 07:30:45 AM     AA0000011113    20 Y    A       Jane, Doe A
AA  09/08/2014 11:01:14 AM     AA0000011114    30 Y    A       John, Doe A
AA  09/08/2014 02:30:46 PM     7BD1111111115   40 Y    B       Jane, Doe A
AA  09/08/2014 02:31:00 PM     AA0000011116    50 Y    A       John, Doe A
AA  09/08/2014 07:30:53 AM     AA0000011117    60 Y    B       Jane, Doe
AA  09/09/2014 07:30:27 AM     AA0000011118    70 Y    A       John, Doe A
AA  09/09/2014 07:30:41 AM     AA0000011119    80 Y    B       Jane, Doe
AA  09/09/2014 07:30:55 AM     AA0000011110    90 Y    A       John, Doe
AA  09/14/2014 07:30:55 AM     AA0000011111    80 Y    A       Jane, Doe A
AA  11/11/2014 07:30:55 AM     AA0000011112    80 Y    A       John, Doe
    
por user72055 18.09.2014 / 17:24

3 respostas

4

Se você tiver a implementação GNU de awk ou mawk 1.3.4-20121129 ou mais recente , tente:

$ awk '
{
    split($2,a,"/");
    split($3,b,":");
    split(strftime("%m/%d/%Y %H:%M:%S",mktime(a[3]" "a[1]" "a[2]" "b[1]" "b[2]" "b[3])),c);
    $2 = c[1];
    $3 = c[2];
    print;
}
' file
AA 09/07/2014 02:30:38 PM AA0000011111 08 Y A Jane, Doe
AA 09/07/2014 11:30:31 AM AA0000011112 09 Y B John, Doe
AA 09/07/2014 07:30:45 AM AA0000011113 20 Y A Jane, Doe A
AA 09/08/2014 11:01:14 AM AA0000011114 30 Y A John, Doe A
AA 09/08/2014 02:30:46 PM 7BD1111111115 40 Y B Jane, Doe A
AA 09/08/2014 02:31:00 PM AA0000011116 50 Y A John, Doe A
AA 09/08/2014 07:30:53 AM AA0000011117 60 Y B Jane, Doe
AA 09/09/2014 07:30:27 AM AA0000011118 70 Y A John, Doe A
AA 09/09/2014 07:30:41 AM AA0000011119 80 Y B Jane, Doe
AA 09/09/2014 07:30:55 AM AA0000011110 90 Y A John, Doe
AA 09/14/2014 07:30:55 AM AA0000011111 80 Y A Jane, Doe A
AA 11/11/2014 07:30:55 AM AA0000011112 80 Y A John, Doe A

Explicação

  • dividimos a string de data, salve no array a
  • dividimos a string de tempo, salve no array b
  • Na próxima parte, usamos a função strftime e mktime para obter o resultado desejado.

    • mktime(a[3]" "a[1]" "a[2]" "b[1]" "b[2]" "b[3]) obtenha a sequência no formato Year Month Day Hour Min Sec para converter o tempo em segundos desde a época.

    • strftime obtenha o formato "%m/%d/%Y %H:%M:%S" e o tempo processado por mktime crie o resultado desejado para nós.

  • Dividimos o resultado, salvamos na matriz c , atribuímos de volta a $2 , $3 e imprimimos a saída.

OBSERVAÇÃO

por 18.09.2014 / 17:49
3

Você especifica a largura e o preenchimento zero usando os modificadores printf no awk:

$ awk -F'[/:]| +' '{ printf "%s %02d/%02d/%02d %02d:%02d:%02d %s %-13s %s %s %s %s %s %s\n",
              $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15 } ' input_file
AA 09/07/2014 02:30:38 PM  AA0000011111  08 Y A Jane, Doe 
AA 09/07/2014 11:30:31 AM  AA0000011112  09 Y B John, Doe 
AA 09/07/2014 07:30:45 AM  AA0000011113  20 Y A Jane, Doe A
AA 09/08/2014 11:01:14 AM  AA0000011114  30 Y A John, Doe A
AA 09/08/2014 02:30:46 PM  7BD1111111115 40 Y B Jane, Doe A
AA 09/08/2014 02:31:00 PM  AA0000011116  50 Y A John, Doe A
AA 09/08/2014 07:30:53 AM  AA0000011117  60 Y B Jane, Doe 
AA 09/09/2014 07:30:27 AM  AA0000011118  70 Y A John, Doe A
AA 09/09/2014 07:30:41 AM  AA0000011119  80 Y B Jane, Doe 
AA 09/09/2014 07:30:55 AM  AA0000011110  90 Y A John, Doe 
AA 09/14/2014 07:30:55 AM  AA0000011111  80 Y A Jane, Doe A
AA 11/11/2014 07:30:55 AM  AA0000011112  80 Y A John, Doe A
    
por 18.09.2014 / 17:50
2

Você também pode usar sed :

sed -e :1 -e 's|^\([^:]*[ /]\)\([0-9][/:]\)||;t1'

Insere um 0 antes de qualquer dígito entre um espaço ou / e / ou : na parte que leva ao primeiro : .

    
por 18.09.2014 / 18:19