-1

Как отформатировать дату для содержимого файла с помощью инструментов командной строки Linux?

Входные данные:
ааа; 1,70; ссс; 20.01.13; ZZ; 2013;
ууу; 2,70; LLL; 17.12.10; ZZ; 2013;
FFF; 3,70; NNN; 31.01.98; ZZ; 2013;
AUU; 8,70; нуу; 30.02.96; ZZ; 2013;

Выход:
ааа; 1,70; ссс; 20.01.2013; ZZ; 2013;
ууу; 2,70; LLL; 17.12.2010; ZZ; 2013;
FFF; 3,70; NNN; 31; 01.1998; ZZ; 2013;
AUU; 8,70; нуу; 30.02.1996; ZZ; 2013;

3 ответа3

0

Предполагая, что любой двузначный год между 70 и 99 происходит в прошлом веке:

sed 's/[7-9][0-9];$/19&/; s/[0-6][0-9];$/20&/' file

Или пусть кто-то другой решит:

perl -MTime::Piece -F';' -ane '
    $F[-2] = Time::Piece->strptime($F[-2], "%d.%m.%y")->strftime("%d.%m.%Y");
    print join(";", @F)
' file

Опции

  • -MTime::Piece импортирует стандартный модуль Perl Time::Piece
  • -F';' -a опции разделяют каждую строку точкой с запятой и сохраняют результат в массиве @F
  • -n циклически перебирает строки во входных данных (stdin или файлы) без автоматической печати каждой строки.

Код

  • $F[-2] является вторым последним полем (где дата была в вашем исходном вопросе).
  • Я использую методы strptime и strftime для разбора и форматирования даты.

Итак, если у вас есть даты, которые должны быть изменены в столбцах с 12 по 15, используйте

perl -MTime::Piece -F';' -ane '
    sub reformat {
        return Time::Piece->strptime(shift, "%d.%m.%y")->strftime("%d.%m.%Y");
    }
    for my $i (11..14) {
        $F[$i] = reformat $F[$i];
    }
    print join(";", @F)
' file
0

Это можно сделать с помощью awk:

   awk -F'[;.]' '{if ($6 <= 13) x=20$6; else x = 19$6 ; print \
                  $1";"$2";"$3";"$4"."$5"."x";"}' 

Эта команда разделяет поля с разделителями ; . , Затем он изменяет последнее поле следующим образом: если оно меньше или равно 13, оно преобразуется в 20last_field , в противном случае оно преобразуется в 19last_filed , а затем печатает поля в том же порядке, что и раньше, с теми же разделителями, включая измененное шестое поле (теперь называется x).

0

Использование dconv из dateutils:

dconv -Si '%d.%m.%y' -f '%d.%m.%Y' <<EOF
aaa;1.70;ccc;20.01.13;zz;2013;
uuu;2.70;lll;17.12.10;zz;2013;
fff;3.70;nnn;31.01.98;zz;2013;
auu;8.70;nuu;30.02.96;zz;2013;
EOF

производит именно тот результат, который вы хотите.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .