#date #csv #awk
#Дата #csv #awk
Вопрос:
Пожалуйста, помогите. Мне нужна команда командной строки unix для файла sample.csv с записями ниже:
1231,aaa,bbb,20161001,20161002,hi-ax
1231,aaa,ccc,20161002,20161003,hi-ay
1231,aaa,ddd,20161001,20161007,hi-az
И вывод должен быть:
1231,aaa,bbb,10/01/2016,10/02/2016,hi-ax
1231,aaa,ccc,10/02/2016,10/03/2016,hi-ay
1231,aaa,ddd,10/01/2016,10/07/2016,hi-az
Может кто-нибудь исправить эту команду? Я пробовал, но он не будет работать без разделителя:
awk -F, '{split($4,a,"");$4=a[2]"/"a[3]"/"a[1]}1' OFS=, sample.csv > output.csv
Ответ №1:
Я бы предпочел использовать функцию для чего-то подобного, это делает ее более удобной в обслуживании, например:
конвертировать-date.awk
function ruin_utc(d) {
year = substr(d, 1, 4)
month = substr(d, 5, 2)
day = substr(d, 7, 2)
return month "/" day "/" year
}
Теперь вы можете использовать функцию следующим образом:
awk -f convert-date.awk -e '{ $4 = ruin_utc($4); $5 = ruin_utc($5) } 1' FS=, OFS=, sample.csv
Или более переносимый:
конвертировать-date2.awk
function ruin_utc(d) {
year = substr(d, 1, 4)
month = substr(d, 5, 2)
day = substr(d, 7, 2)
return month "/" day "/" year
}
{ $4 = ruin_utc($4); $5 = ruin_utc($5) }
1
Запустите его следующим образом:
awk -f convert-date.awk FS=, OFS=, sample.csv
Вывод:
1231,aaa,bbb,10/01/2016,10/02/2016,hi-ax
1231,aaa,ccc,10/02/2016,10/03/2016,hi-ay
1231,aaa,ddd,10/01/2016,10/07/2016,hi-az
Комментарии:
1. Я одновременно запускаю функцию и команду и получаю сообщение об ошибке: синтаксическая ошибка: `(‘ не ожидается. Или я могу неправильно его запускать … как?
2. @xoxopepper: работает ли это, если поместить скрипт между кавычками в
convert-date.awk
файл? Какую версию awk вы используете3. @xoxopepper: Видишь
convert-date2.awk
.
Ответ №2:
С помощью GNU awk для gensub():
$ cat tst.awk
BEGIN { FS=OFS="," }
function cvt(dt) { return gensub(/(....)(..)(..)/,"\2/\3/\1",1,dt) }
{ $4=cvt($4); $5=cvt($5); print }
$ awk -f tst.awk file
1231,aaa,bbb,10/01/2016,10/02/2016,hi-ax
1231,aaa,ccc,10/02/2016,10/03/2016,hi-ay
1231,aaa,ddd,10/01/2016,10/07/2016,hi-az