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

时间:2013-02-11 10:48:33

标签: parsing unix date csv increment

我已经搜索过高低,以寻找可以做到这一点的事情。 我认为这将是相对直接的。

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

对方法的任何想法都表示赞赏。

2 个答案:

答案 0 :(得分:1)

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

编辑:上面你的评论,你有什么样的Unix,你没有访问Perl / Python / Ruby等。

答案 1 :(得分:0)

这是使用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

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;COL27 1234567;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;05.02.2013

结果:

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

要覆盖原始文件,请使用重定向:

awk -f script.awk file > temp && mv temp file