Может кто-нибудь предложить быстрый oneliner для преобразования 20111214 в 2011.12.14 в Unix? - PullRequest
2 голосов
/ 14 декабря 2011

я думаю, что это должно быть выполнимо в sed / awk, верно? преобразовать следующий список в 2011.08.01 ... и т. д.

20110801
20110802
20110803
20110804
20110805
20110808

просто не достаточно умен, чтобы понять, как это сделать

какие-либо предложения?

Ответы [ 7 ]

7 голосов
/ 14 декабря 2011
date -d '20111214' +'%Y.%m.%d'

Строка ввода может быть близка ко всему, что может быть идентифицировано как дата.

7 голосов
/ 14 декабря 2011

Использование даты GNU:

    for date in 20110801 20110802 20110803 20110804 20110805 20110808; do
            date -d "$date" +%Y.%m.%d
    done

Это неверная дата.

3 голосов
/ 14 декабря 2011

Это может работать для вас:

 sed 's/../.&/3g'
3 голосов
/ 14 декабря 2011

В седе:

sed 's/\(....\)\(..\)\(..\)/\1.\2.\3/'

Как отметил potong в комментарии, на самом деле нет необходимости указывать все три группы. Вместо этого вы можете использовать

sed 's/\(....\)\(..\)/\1.\2./'
3 голосов
/ 14 декабря 2011
export V=20111010;echo ${V:0:4}.${V:4:2}.${V:6:2}

Так что для вашего случая, что-то вроде:

while read x; do echo ${x:0:4}.${x:4:2}.${x:6:2}; done
1 голос
/ 14 декабря 2011

простак

gawk '/^[0-9]+$/{print substr($0,1,4)"."substr($0,5,2)"."substr($0,7,2)}' input.txt
0 голосов
/ 15 декабря 2011

Для awk, почему substr, когда у вас есть printf ??

awk 'NF{printf("%.4s.%.2d.%.2d\n", $1, $1%10000/100, $1%100)}'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...