преобразование гггг в мм / дд / гггг в файле csv

#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