Относительно формата даты переменной UNIX - PullRequest
1 голос
/ 23 сентября 2010

У меня есть значение даты, хранящееся в переменной сценария Unix KornShell (ksh):

VALUE="2010_09_23"

Я хочу изменить его на "23-Sep-2010" и сохранить его в VALUE1. Как я могу это сделать?

VALUE1="23-Sep-2010"

Ответы [ 5 ]

3 голосов
/ 23 сентября 2010

Ksh имеет встроенную возможность форматирования даты через printf.В документации не ясно, как аргумент должен быть отформатирован;в моем ksh 93s + работают следующие:

VALUE1=$(printf "%(%02d-%b-%Y)T\n" "${VALUE//_/-}")
2 голосов
/ 23 сентября 2010

Использование переносного awk и жестко закодированный список названий месяцев. Обработка вызовов substr в обход сложной проблемы заключается в интерпретации чисел '08' и '09' в некоторых реализациях awk: являются ли они десятичными числами '8' и '9' или неверными восьмеричными числами?

echo "$VALUE" | awk -F'_' '
    BEGIN {
        OFS="-"
        split("Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec", m)
    }
    {
        $2 = 10 * substr($2, 1, 1) + substr($2, 2, 1)
        print $3, m[$2], $1
    }'
0 голосов
/ 23 сентября 2010

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

echo 2010_09_23 |  perl '-MPOSIX qw(strftime)'  -le'
    @dt = split /_/,<STDIN>;
    print strftime( "%d-%b-%Y",0,0,0,$dt[2],$dt[1]-1,$dt[0]-1900);
  '

Вывод:

23-Sep-2010
0 голосов
/ 23 сентября 2010
VALUE="2010_09_23"
VALUE1="$( gawk -v date="$VALUE" 'BEGIN {
    gsub(/_/, " ", date)
    print strftime("%d-%b-%Y", mktime(date " 00 00 00"))
}')"
0 голосов
/ 23 сентября 2010

Эта команда делает то, что вы хотите в OSX:

VALUE1=$(date -j -f %Y_%m_%d +%d-%b-%Y "$VALUE")

Если вы используете другой вариант Unix, комбинация параметров для date, которая вам требуется, может отличаться.Примечание % хорошо стандартизировано (см. man strftime), но возможности команды date не таковы.

GNU coreutils date (то, что вы получаете в Linux, и которое также может бытьчто-то скрывается в вашей системе «SunOS» (я сомневаюсь, что вы на самом деле означаете «SunOS», Sun Microsystems не называет свой вариант Unix, который около пятнадцати лет, но даже в этом случае материал в /usr/binвсе еще невероятно устаревший мусор) - посмотрите в /usr/local и во всех подкаталогах /opt - также можно сделать это, но вы должны предварительно обработать ввод:

VALUE1=$(date -d $(echo $VALUE | tr _ -) +%d-%b-%Y)

Этот может также работают, в зависимости от того, какая именно у вас оболочка:

VALUE1=$(date -d ${VALUE//_/-} +%d-%b-%Y)
...