Как суммировать столбец за 2 часа до даты в файле csv

У меня есть файл csv, состоящий из 2 столбцов, имени и даты в 24-часовом формате.

Name, log_date

John, 11/29/2017 23:00

И я хочу добавить 2 часа к дате регистрации, чтобы изменить дату и время, как показано ниже.

John, 11/30/2017 01:00

Я попытался добавить его с помощью команды ниже, но безуспешно

awk - F 'NR>1{$4+=(2/24);}1' OFS="," IN.csv > OUT.csv

Я получаю вывод ниже

2017.08

в значениях столбца даты журнала

Пожалуйста, помогите


person Tharwat    schedule 30.11.2017    source источник
comment
Дата тоже должна переноситься? т. е. если вы добавите 2 часа к 23:00, должно ли это быть 01:00 следующего дня? Я спрашиваю об этом, потому что из вашей попытки это не кажется требованием.   -  person Vasan    schedule 30.11.2017
comment
Спасибо Васан, я обновил это в вопросе   -  person Tharwat    schedule 30.11.2017
comment
comment
Это хороший вопрос. Но ваша попытка решить проблему неадекватна. Сначала проанализируйте проблему, а затем опубликуйте более адекватное решение, близкое к проблеме.   -  person sjsam    schedule 30.11.2017
comment
@ Джо, я не думаю, что это дубликат вопроса, который вы процитировали, поскольку в нем конкретно упоминается awk. Только этот тег bash для большей наглядности.   -  person sjsam    schedule 30.11.2017
comment
@ Джо, мой вопрос отличается от твоего, так как мне нравится добавлять 2 часа ко всем значениям столбцов дат с помощью awk   -  person Tharwat    schedule 30.11.2017


Ответы (3)


Все, что вам нужно, задокументировано здесь.

Использование пробела в качестве разделителя полей:

{
     split($2,D,"/")
     split($3,H,":")
     # format for mktime is "YYYY MM DD HH MM SS [DST]"
     d = D[3] " " D[1] " " D[2]" " H[1] " " H[2] " 00"
     t=mktime(d)
     t = t + 7200 # add two hours
     $2 = strftime("%m/%d/%Y",t)
     $3 = strftime("%H:%M",t)
}1
person Setop    schedule 30.11.2017
comment
Большое спасибо, setop, это решение отлично работает после его редактирования. ,D,/) split(N[2],H,:) d = D[1] D[2] D[3] H[1] H [2] 00 # формат mktime: ГГГГ ММ ДД ЧЧ ММ СС [DST] t=mktime(d) t = t + 7200 $2 = strftime(%Y/%m/%d %H:%M, t) }1' IN.csv › OUT.csv - person Tharwat; 30.11.2017

Вам нужен язык с арифметикой даты и времени. Перл например:

perl -MTime::Piece -F'/,\s*/' -slane '
    $datetime = Time::Piece->strptime($F[1], $fmt);
    $F[1] = ($datetime + 7200)->strftime($fmt);
    print join ", ", @F
' -- -fmt="%m/%d/%Y %H:%M" <<END
John, 11/29/2017 11:00
END
John, 11/29/2017 13:00

Учитывая ваш ввод, невозможно указать, что время 23:00. Откуда ты должен это знать?

person glenn jackman    schedule 30.11.2017
comment
Время в 24-часовом формате, я не говорю на Perl, поэтому мне сложно настроить его для использования в CSV-файле. Можете ли вы добавить рекомендации по коду, чтобы настроить его в моем файле? - person Tharwat; 30.11.2017

ниже показан oneliner в python. Это действительно непригодный для использования код, но я считаю, что вы можете понять, как использовать однострочники. Этот однострочник можно сделать еще проще.

python -c "s=r'John, 11/29/2017 13:00'; 
print(s.replace(s.split(\" \")[-1].split(\":\")[0],str(int(s.split(\" \")[-1].split(\":\")[0])+2)));";

Выход

John, 11/29/2017 15:00

Тем не менее, это не перенесет дату, как если бы 23 + 2 = 25, что должно быть 1:00.

person Ajay2588    schedule 30.11.2017
comment
хм :) Я думаю, что perl или python - лучшее решение этой проблемы. - person sjsam; 30.11.2017