Используйте awk для заполнения форматов даты и времени

Я склонен использовать SysRescueCD. Это содержит много инструментов, как которые я нахожу полезными для восстановления данных, ddrescue и testdisk.

4
04.07.2016, 20:05
3 ответа

Если у вас есть реализация GNU awk или mawk 1.3.4-20121129 или новее , попробуйте:

$ 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

Пояснение

  • Мы разделяем строку даты, сохраняем в массив a
  • Мы разделяем строку времени, сохраняем в массив b
  • В следующей части мы используем strftime и функция mktime для получения желаемого результата.

    • mktime (a [3] "" a [1] "" a [2] "" b [1] "" b [2] "" b [3]) получить строку в формате Год Месяц День Час Мин. Сек для преобразования времени в секунды с начала отсчета.

    • strftime получить формат «% m /% d /% Y% H:% M:% S» и время, обработанное mktime , создать желаемый результат для нас.

  • Мы разделяем результат, сохраняем его в массиве c , присваиваем обратно $ 2 , $ 3 и печатаем результат.

ПРИМЕЧАНИЕ

4
27.01.2020, 20:49

Вы указываете ширину и заполнение нулями с помощью модификаторов printf в 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
3
27.01.2020, 20:49

Вы также можете использовать sed :

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

Вставляет 0 перед любой отдельной цифрой между пробелом или / и / или : в части, ведущей к первому : .

2
27.01.2020, 20:49

Теги

Похожие вопросы