Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix:在csv文件中按天递增日期列_Unix_Date_Sed - Fatal编程技术网

Unix:在csv文件中按天递增日期列

Unix:在csv文件中按天递增日期列,unix,date,sed,Unix,Date,Sed,需要帮助。我想将csv中的日期(字符串)列增加一天。 e、 g.(日期格式yyyy MM dd) 预期产量 Col1,Col2,Col3 ABC,001,1900-01-02 XYZ,002,2000-01-02 有一款内置了从1752年9月14日到9999年12月31日的所有日期魔法:日历cal。我们将利用它的智能优势,而不是重新发明轮子,进行混乱的日期计算。基本问题是:给定一个日期,它是一个月的最后一天吗?如果不是,只需增加一天即可。如果是,则将天重置为1,并增加月(可能还有年) 但是,c

需要帮助。我想将csv中的日期(字符串)列增加一天。 e、 g.(日期格式yyyy MM dd)

预期产量

Col1,Col2,Col3
ABC,001,1900-01-02
XYZ,002,2000-01-02
有一款内置了从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
我们需要的是一份天数清单,12天3天。。。28我们可以跳过“1”之前的所有内容:

现在ARG的数量为我们提供了1900年2月的天数:

 $ echo $#
 28
将所有这些放在一个脚本中:

#/垃圾箱/垃圾箱
read-r头
printf“%s\n”$header
当IFS=,-read-rcol1ycol2ymd;做
案例中的$m-$d
(12-31)y=$((y+1))m=01 d=01;;
(*)
设置--$(cal$m$y)
#移开月份和工作日名称。
而测试$1!=1.做转移;完成
#这一天是一个月的最后一天吗?
如果测试${d#0}-eq$#;然后
#是:增量m和重置d=01。
m=$(printf%02d$(${m#0}+1)))
d=01
其他的
#否:增量d。
d=$(printf%02d$(${d#0}+1)))
fi
;;
以撒
printf“%s,%s,%s-%s-%s\n“$col1”$col2”$y$m$d
完成
在此输入上运行它:

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
将起作用。

有一个内置了从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
我们需要的是一份天数清单,12天3天。。。28我们可以跳过“1”之前的所有内容:

现在ARG的数量为我们提供了1900年2月的天数:

 $ echo $#
 28
将所有这些放在一个脚本中:

#/垃圾箱/垃圾箱
read-r头
printf“%s\n”$header
当IFS=,-read-rcol1ycol2ymd;做
案例中的$m-$d
(12-31)y=$((y+1))m=01 d=01;;
(*)
设置--$(cal$m$y)
#移开月份和工作日名称。
而测试$1!=1.做转移;完成
#这一天是一个月的最后一天吗?
如果测试${d#0}-eq$#;然后
#是:增量m和重置d=01。
m=$(printf%02d$(${m#0}+1)))
d=01
其他的
#否:增量d。
d=$(printf%02d$(${d#0}+1)))
fi
;;
以撒
printf“%s,%s,%s-%s-%s\n“$col1”$col2”$y$m$d
完成
在此输入上运行它:

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

使用
date
命令,可以在awk中执行此操作:

awk 'BEGIN{FS=OFS=","}NR>1{("date -d\""$3" +1 day\" +%Y-%m-%d")|getline newdate; $3=newdate; print}' file.in

使用
date
命令,这可以在awk中完成:

awk 'BEGIN{FS=OFS=","}NR>1{("date -d\""$3" +1 day\" +%Y-%m-%d")|getline newdate; $3=newdate; print}' file.in

如果可以从文件中提取日期,则可以使用:

d="1900-01-01"  # date from file
date --date '@'$(( $(date --date $d +"%s") + 86400 ))

如果可以从文件中提取日期,则可以使用:

d="1900-01-01"  # date from file
date --date '@'$(( $(date --date $d +"%s") + 86400 ))


sed
不知道日期。你必须使用一种更强大的语言,比如Python。有时你需要增加月份,有时需要增加年份,月份的长度不同,还有循环年。。这是sed的自杀任务。这不是sed的工作。在我发布答案之前,我必须知道,1900年是否真的在你的档案中?或者你只是以身作则。如果您最早的日期是1902年之后,我可以发布答案。使用awkHint:给定一个日期,你可以使用
日期+1天-d'1900-01-01+1天'
@fedorqui你试过那句话吗?
sed
不知道日期。你必须使用一种更强大的语言,比如Python。有时你需要增加月份,有时需要增加年份,月份的长度不同,还有循环年。。这是sed的自杀任务。这不是sed的工作。在我发布答案之前,我必须知道,1900年是否真的在你的档案中?或者你只是以身作则。如果您最早的日期是1902年之后,我可以发布答案。使用awkHint:给定一个日期,您可以使用
日期-d'1900-01-01+1天'
@fedorqui+1天'@fedorqui-您试过这句话吗?这里不起作用。您的日期
-d
选项是非标准的。GNUism?在这里不起作用。您的日期
-d
选项是非标准的。A GNUism?谢谢Jens。。太棒了,不客气。下一步是通过单击左侧的复选标记接受此答案。谢谢Jens。。太棒了,不客气。下一步是通过单击左侧的复选标记接受此答案。这还需要一个带有GNUisms的非标准日期实用程序(并打印一些看起来不像YYYY-MM-dd的内容)。这还需要一个带有GNUisms的非标准日期实用程序(并打印一些看起来不像YYYY-MM-dd的内容)。