需要帮助。我希望将csv中的Date(这是一个字符串)列增加一天。 例如(日期格式yyyy-MM-dd)
Col1,Col2,Col3
ABC,001,1900-01-01
XYZ,002,2000-01-01
预期OutPut
Col1,Col2,Col3
ABC,001,1900-01-02
XYZ,002,2000-01-02
答案 0 :(得分:3)
有一个standard Unix utility具有从1752年9月14日到9999年12月31日内置的所有日期魔法:日历cal
。我们不会重新发明轮子并进行凌乱的日期计算,而是利用其智能来发挥我们的优势。基本问题是:给定日期,是一个月的最后一天吗?如果没有,只需增加日期。如果是,请将日期重置为1并增加月份(可能还有一年)。
但是,cal
的输出未指定,可能如下所示:
$ cal 2 1900
February 1900
Su Mo Tu We Th Fr Sa
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28
我们需要的是一系列日期,1 2 3 ...... 28.我们可以通过将所有内容跳到“1”来实现:
set -- $(cal 2 1900)
while test $1 != 1; do shift; done
现在,args的数量为我们提供了1900年2月的天数:
$ echo $#
28
将所有内容放在一个脚本中:
#!/bin/sh
read -r header
printf "%s\n" "$header"
while IFS=,- read -r col1 col2 y m d; do
case $m-$d in
(12-31) y=$((y+1)) m=01 d=01;;
(*)
set -- $(cal $m $y)
# Shift away the month and weekday names.
while test $1 != 1; do shift; done
# Is the day the last day of a month?
if test ${d#0} -eq $#; then
# Yes: increment m and reset d=01.
m=$(printf %02d $((${m#0}+1)))
d=01
else
# No: increment d.
d=$(printf %02d $((${d#0}+1)))
fi
;;
esac
printf "%s,%s,%s-%s-%s\n" "$col1" "$col2" $y $m $d
done
在此输入上运行:
Col1,Col2,Col3
ABC,001,1900-01-01
ABC,001,1900-02-28
ABC,001,1900-12-31
XYZ,002,2000-01-01
XYZ,002,2000-02-28
XYZ,002,2000-02-29
产量
Col1,Col2,Col3
ABC,001,1900-01-02
ABC,001,1900-03-01
ABC,001,1901-01-01
XYZ,002,2000-01-02
XYZ,002,2000-02-29
XYZ,002,2000-03-01
我做了一个小小的假设:前两列不包含-
或转义的逗号。如果他们这样做,IFS=,- read
将会采取行动。
答案 1 :(得分:0)
使用date
命令,可以在awk中完成:
awk 'BEGIN{FS=OFS=","}NR>1{("date -d\""$3" +1 day\" +%Y-%m-%d")|getline newdate; $3=newdate; print}' file.in
答案 2 :(得分:0)
如果您可以从文件中提取日期,则可以使用:
d="1900-01-01" # date from file
date --date '@'$(( $(date --date $d +"%s") + 86400 ))