替换列的CSV文件值

时间:2013-12-06 14:00:58

标签: linux bash csv sed awk

我有一个具有以下结构的CSV文件:

31126000283424431;32285076389;t;text text;1;3;;1;1;0.9;0.81;0;0;1;1;1;2013-11-21;;NL
31126000279521531;32308233749;c;text text;1;2;;1;9;2.79;7.78;0;0;4;16;9;2013-11-21;;NL
31126000279406931;32291254349;c;text text;1;5;;1;3;0.98;0.96;0;0;3;9;0;2013-11-21;;NL
31126000272138431;32284912829;c;text text;1;3;;1;1;0;0;0;0;3;9;0;2013-11-21;;NL
31126000271468431;32304086789;t;text text;1;5;;1;1;0.2;0.04;0;0;2;4;1;2013-11-21;;NL
31126000269838731;29269530509;c;text text;1;1;;1;1;0.45;0.2;0;0;3;9;0;2013-11-21;;NL

我需要将第六个分号后的数字替换为0。

因此输出文件如下所示:

31126000283424431;32285076389;t;text text;1;0;;1;1;0.9;0.81;0;0;1;1;1;2013-11-21;;NL
31126000279521531;32308233749;c;text text;1;0;;1;9;2.79;7.78;0;0;4;16;9;2013-11-21;;NL
31126000279406931;32291254349;c;text text;1;0;;1;3;0.98;0.96;0;0;3;9;0;2013-11-21;;NL
31126000272138431;32284912829;c;text text;1;0;;1;1;0;0;0;0;3;9;0;2013-11-21;;NL
31126000271468431;32304086789;t;text text;1;0;;1;1;0.2;0.04;0;0;2;4;1;2013-11-21;;NL
31126000269838731;29269530509;c;text text;1;0;;1;1;0.45;0.2;0;0;3;9;0;2013-11-21;;NL

我一直在尝试awk,sed和cut,但是我无法让它工作。

谢谢

4 个答案:

答案 0 :(得分:7)

您的示例显示第6个col,但是在 5th 半。

之后
awk -F';' -v OFS=';' '$6=0;7' file

尝试上面的一行

答案 1 :(得分:1)

sed "s/;[^;]\{1,\}/;0/5" YourFile.csv

假设colum中总有一些东西

sed "s/;[^;]*/;0/5" YourFile.csv

即使没有数字也是第6列

答案 2 :(得分:0)

如果你的机器上有php,你可以使用这个非常方便的CSV Paser class。它会将您的CSV转换为2D数组,您可以使用foreach循环从中循环并更改数据。

$csvFile
foreach($csvFile as $value){
    foreach($value as $k => $v){
        if($k == 5){ $v = 0}
    }
}

这会将其自动化为任何大小相同格式的CSV文件。

答案 3 :(得分:0)

perl -MText::CSV_XS -e'$csv=Text::CSV_XS->new({sep_char=>";", eol=>"\n"}); while($row=$csv->getline(ARGV)) {$row->[5]=0;$csv->print(STDOUT, $row)}'

用作过滤器或输入文件作为参数。您应该使用适当的CSV解析器进行任何认真的工作。