使用awk更新csv文件的日期列

时间:2015-07-15 05:51:51

标签: bash csv awk

csv文件中存在的行 例如

POC,1234567890,2345678901,2014-06-03 09:20:43,250

我想只更新日期列(第4列 - 日期时间)而不是更新csv文件的时间。但我的awk命令正在更新完整的第4列,时间被截断,我不想要,我该怎么办?

Awk Command

awk -F, 'NR>2 && NR<=1000{$4="2015-07-01";}1' OFS=, Input.csv> Output.csv

不应在output.csv文件中截断时间。(日期和时间用空格分隔)

输出应该是

POC,1234567890,2345678901,2015-07-01 09:20:43,250

注意 - 1.原始文件中的所有日期都不相同,但它们都需要转换为相同的新日期。 2.原始文件中的日期格式可以是任何格式(dd-M-yyyy / dd-MM-yyyy / dd-MMM-yy)

3 个答案:

答案 0 :(得分:2)

@model IEnumerable<Person>

@foreach(var person in Model)
{
    <a href="#" data-name="@person.Name" class="view-detail">View person</a>
}

<script src="~/scripts/bootbox.min.js"></script>
<script>
    $(function(){

        $('a.view-detail').on('click', function(e){
            e.preventDefault(); // cancel the navigation event

            var name = $(this).data('name');
            bootbox.alert(name);
        });

    });
</script>

您并未真正指出原始日期中的所有日期是否相同,是否所有日期都需要转换为相同的新日期,但sub(/2014-06-03/, "2015-07-01", $4) 命令会执行基于正则表达式的替换。

  

原始文件中的所有日期都不相同,但它们都需要转换为相同的新日期。

因此正则表达式需要更复杂一些:

sub

如果不将其保留为2,您可以将第一个sub(/[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]/, "2015-07-01", $4) 更改为[0-9]。您可以玩其他游戏(本月为[12]等)。但有时简单就足够了。你没有验证旧日期;你正在替换它。

答案 1 :(得分:2)

以下是仅替换第4列中的日期组件的脚本。

awk -F, 'NR>2 && NR<=1000{sub(/[^[:space:]]*/,"2015-07-01",$4);}1' OFS=, Input.csv> Output.csv

答案 2 :(得分:0)

由于$4具有固定值,因此这是一种快速且丑陋的方式:

awk 'NR>2 && NR<=1000{$4="2015-07-01";}1' FS="( |,)" OFS="," Input.csv |sed -e "s/-01,/-01 /" > Output.csv

我个人更喜欢Jonathan的流程。

相关问题