将新列添加到CSV文件

时间:2017-02-05 13:12:45

标签: csv awk sed

我有一个如下所示的CSV文件:

"12345","TestTest","1.2","TestTest
"

我想在CSV文件的开头或结尾添加日期,例如YYYY-MM-DD HH:MM:SS。正如您在上面的示例中所看到的,双引号(“)包含列上的值,逗号(,)描述每列。问题是该行末尾的双引号始终在新行上。这意味着当我尝试使用sed基于单个双引号搜索/替换时,我的替换最终不仅在行的开头,而且在行的末尾。

我的下一个理论是,如果可以使用某些工具(sed,awk,无论如何)只在CSV行的开头是双引号和数字即“12345”时添加日期,那么新的线看起来像:

"YYYY-MM-DD HH:MM:SS","12345","TestTest","1.2","TestTest
"

注意:您建议的此命令应将此更改应用于CSV文件中的每一行。这也需要通过linux命令行运行。

谢谢,

3 个答案:

答案 0 :(得分:2)

awk救援!

$ awk -F, 'NF>1{$0 = "\"YYYY-MM-DD\"" FS $0}1' file

NF>1测试检查该行上是否有多个字段,如果是这样,则在新字段前加上,1在结尾处是{print}的简写。

答案 1 :(得分:1)

使用sed:

sed 'N;s/^/"YYYY-MM-DD HH:MM:SS",/' file

如果您想确保下一行有一个"

sed 'N;/\n"$/s/^/"YYYY-MM-DD HH:MM:SS",/' file

修改

在第5个字段后插入字符串:

sed 'N;s/","/","YYYY-MM-DD HH:MM:SS","/5' file

答案 2 :(得分:1)

我建议使用csv解析器来避免可能包含分隔符或新行的字段出现问题。您可以在perl命令行中使用Text::CSV模块。在第4列中插入字符串的示例:

perl -MText::CSV -E'$csv = Text::CSV->new({binary=>1}); 
while ($row = $csv->getline(STDIN)){
    splice @$row, 3, 0, "YYYY-MM-DD";
    say "\"", join("\",\"",@$row), "\""
}' file.csv