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
Parsing Unix:解析一个csv(实际上是分号)分隔的文件,将每个日期字段增加一天_Parsing_Unix_Date_Csv_Increment - Fatal编程技术网

Parsing Unix:解析一个csv(实际上是分号)分隔的文件,将每个日期字段增加一天

Parsing Unix:解析一个csv(实际上是分号)分隔的文件,将每个日期字段增加一天,parsing,unix,date,csv,increment,Parsing,Unix,Date,Csv,Increment,我到处寻找能做到这一点的东西。 我认为这会比较直截了当 我使用了包含awk的bash脚本来替换特定列中的日期,但我不知道如何自动识别日期字段,智能地增加日期,并将修改后的日期写回文件。每行包含大约30列,大约10列包含dd.mm.YYYY格式的日期 任何关于方法的想法都将受到赞赏 我将编写一个脚本(Perl?)来实现这一点,并使用该脚本语言的日期库(例如)智能地处理日期。Perl(或您自己喜欢的脚本语言)应该能够处理打开文件、读取/解析、执行日期操作和重新写入等所有复杂操作,而不会产生其他进程等

我到处寻找能做到这一点的东西。 我认为这会比较直截了当

我使用了包含awk的bash脚本来替换特定列中的日期,但我不知道如何自动识别日期字段,智能地增加日期,并将修改后的日期写回文件。每行包含大约30列,大约10列包含dd.mm.YYYY格式的日期

任何关于方法的想法都将受到赞赏

我将编写一个脚本(Perl?)来实现这一点,并使用该脚本语言的日期库(例如)智能地处理日期。Perl(或您自己喜欢的脚本语言)应该能够处理打开文件、读取/解析、执行日期操作和重新写入等所有复杂操作,而不会产生其他进程等


编辑:在上面的评论中,您有什么样的Unix,您没有访问Perl/Python/Ruby等的权限?

这里有一种使用
GNU awk
的方法。运行方式如下:

awk -f script.awk file
script.awk的内容

BEGIN {
    OFS=FS=";"
}

{
    for (i=1;i<=NF;i++) {

        dx = mktime(gensub(/(..)\.(..)\.(....)/, "\\3 \\2 \\1 0 0 0", "", $i)) + 86400

        $i = (dx == "86399" ? $i : strftime("%d.%m.%Y", dx))
    }
}1
结果:

COL1;COL2;COL3;COL4;COL5;COL6;COL7;COL8;COL9;COL10;COL11;COL12;COL13;COL14;COL15;COL16;COL17;COL18;COL19;COL20;COL21;COL22;COL23;COL24;COL25;COL26;COL27 1234567;12345;Abc;123;12345678999;ABC;1234-123456-12-123;1234567;16.11.2012;16.11.2012;01.02.2013;11.01.2011;11.01.2014;11.01.2013;11.01.2014;;Abc/123;1A;;0;0;Abcdef;16.01.2014;16.01.2014;ABC;-123456789;06.02.2013
或者,这里有一个班轮:

awk -F ";" '{ for (i=1;i<=NF;i++) { dx = mktime(gensub(/(..)\.(..)\.(....)/, "\\3 \\2 \\1 0 0 0", "", $i)) + 86400; $i = (dx == "86399" ? $i : strftime("%d.%m.%Y", dx)) } }1' OFS=";" file

COL1;COL2;COL3;COL4;COL5;COL6;COL7;COL8;COL9;COL10;COL11;COL12;COL13;COL14;COL15;COL16;COL17;COL18;COL19;COL20;COL21;COL22;COL23;COL24;COL25;COL26;COL271234567;12345;Abc;123;12345678999;ABC;1234-123456-12-123;1234567;15.11.2012;15.11.2012;31.01.2013;10.01.2011;10.01.2014;10.01.2013;10.01.2014;;Abc/123;1A;;0;0;Abcdef;15.01.2014;15.01.2014;ABC-123456789;2013年2月5日
我没有访问Perl的权限。我和巴什很合得来。样本:
COL1;COL2;COL3;COL4;COL5;COL6;COL7;COL8;COL9;COL10;COL11;COL12;COL13;COL14;COL15;COL16;COL17;COL18;COL19;COL20;COL21;COL22;COL23;COL24;COL25;COL26;COL271234567;12345;Abc;123;12345678999;ABC;1234-123456-12-123;1234567;15.11.2012;15.11.2012;31.01.2013;10.01.2011;10.01.2014;10.01.2013;10.01.2014;;Abc/123;1A;;0;0;Abcdef;15.01.2014;15.01.2014;ABC-123456789;2013年2月5日
如果你对bash很满意,那就去做你想做的吧。我们以为你有问题,但也许我们误解了你的问题。我对
bash
很熟悉,但我也会在这里使用脚本语言。你很难理解吗。
awk -F ";" '{ for (i=1;i<=NF;i++) { dx = mktime(gensub(/(..)\.(..)\.(....)/, "\\3 \\2 \\1 0 0 0", "", $i)) + 86400; $i = (dx == "86399" ? $i : strftime("%d.%m.%Y", dx)) } }1' OFS=";" file
awk -f script.awk file > temp && mv temp file